是否可以使用 Criteria 或 DetachedCriteria Hibernate 进行此查询

Posted

技术标签:

【中文标题】是否可以使用 Criteria 或 DetachedCriteria Hibernate 进行此查询【英文标题】:Is this query possible using Criteria or DetachedCriteria Hibernate 【发布时间】:2017-08-14 16:27:23 【问题描述】:

问题很简单,这个查询可以在 Hibernate 中使用 Criteria 或 DetachedCriteria 完成吗?我猜不是,但我想做这个问题可能存在一种解决方法。

SELECT
  COLUMNS 
FROM table
WHERE id not in (
    SELECT * FROM (
        SELECT id 
        FROM table
        WHERE
        SOMECONDITIONS   
        ORDER BY timestamp desc limit 0, 15
  ) 
  as t);

我会将@Dean Clark 的答案标记为正确,但接下来会出现另一个问题

where can i find the findByCriteria from SessionFactory we are not using Spring 

【问题讨论】:

【参考方案1】:

要完全匹配您的查询,您确实需要分两步完成,但如果可能,我会避免这样做:

final Criteria innerCriteria = getSession().createCriteria(YourEntity.class);
// SOME CONDITIONS
innerCriteria.add(Restrictions.eq("someColumn", "someValue"));
innerCriteria.addOrder(Order.desc("timestamp"));
innerCriteria.setMaxResults(15);
innerCriteria.setProjection(Projections.id());
List<YourIdClass> ids = innerCriteria.list();


final Criteria criteria = getSession().createCriteria(YourEntity.class);
criteria.add(Restrictions.not(Restrictions.in("id", ids)));
List<YourEntity> results = criteria.list();

您尝试识别的对象是否具有相同的“某些条件”?如果是这样,这将在功能上完成您正在寻找的内容:

final DetachedCriteria criteria = DetachedCriteria.forClass(YourEntity.class);
// SOME CONDITIONS
criteria.add(Restrictions.eq("someColumn", "someValue"));
criteria.addOrder(Order.desc("timestamp"));
getHibernateTemplate().findByCriteria(criteria, 16, 9999999);

【讨论】:

在哪里可以找到我们没有使用 Spring 的 SessionFactory 的 findByCriteria

以上是关于是否可以使用 Criteria 或 DetachedCriteria Hibernate 进行此查询的主要内容,如果未能解决你的问题,请参考以下文章

与 NHibernate 和标准联合?

使用方法:JPQL或Criteria API? [关闭]

使用啥:JPQL 或 Criteria API? [关闭]

criteria函数怎么用

如何使用 JPA Criteria API 连接不相关的实体

试图理解 Doctrine Criteria() 以及是不是可以缓存