【问题标题】:Hibernate Criteria Query without Relationship Between Entities没有实体之间关系的休眠条件查询
【发布时间】:2014-09-17 14:53:27
【问题描述】:

我有两张桌子:

A (x, y, z, date1, date2)
B (t, date1, date2)

我想执行这样的查询:

SELECT A.x, A.y, A.z, A.date1
FROM   A, B 
WHERE  A.date1 < B.date1 
AND   (A.date2 is null or A.date2 <= B.date2 )
ORDER BY A.x DESC;

如何使用 Hibernate Criteria 做到这一点?

【问题讨论】:

    标签: java hibernate criteria hibernate-criteria


    【解决方案1】:
    String           dateIdValue   = "...";
    Class<?>         mainClass     = A.class;
    Class<?>         dateClass     = B.class;
    
    String           colDate1      = "date1";
    String           colDate2      = "date2";
    String           colDateId     = "id";
    
    Property         date1Prop     = Property.forName(colDate1);
    Property         date2Prop     = Property.forName(colDate2);
    
    DetachedCriteria date1Criteria = DetachedCriteria.forClass(dateClass)
                                                     .setProjection(date1Prop)
                                                     .add(Restrictions.eq(colDateId, dateIdValue));
    DetachedCriteria date2Criteria = DetachedCriteria.forClass(dateClass)
                                                     .setProjection(date2Prop)
                                                     .add(Restrictions.eq(colDateId, dateIdValue));
    
    Criteria         criteria      = getSession().createCriteria(mainClass)
                                    .add(date1Prop.lt(date1Criteria))
                                    .add(Restrictions.or(date2Prop.isNull(), date2Prop.le(date2Criteria)))
                                    .addOrder(Order.desc("x"));
    
    /*
        SELECT A.*
        FROM   A, P
        WHERE  A.date1 < P.date1
        AND   (A.date2 is null or A.date2 <= P.date2 )
        ORDER BY A.x DESC;
     */
    

    【讨论】:

    • 你能解释一下colDateIddateIdValue是什么吗?
    【解决方案2】:

    使用子查询。像这样。

       select a,b,c,date3
           from A
           where date3 is null or 
           date3 < (select p.date1 from P p) 
           order by a desc;
    

    但是!如果实体之间没有映射关系,这不是 Hibernate 的设计目的,直接使用 SQL 可能更好。

    【讨论】:

    • 我不想写 sql 或 hql 或 jpql。我想使用 Criteria API 获得结果。
    • @mmdemirbas 做了一些与我在 Criteria API 中的建议类似的事情。尽管如果此查询是一项有效的业务,您的域映射应该允许它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多