Hibernate的Criteria API是否仍然不支持嵌套关系

问题描述:

我想使用Hibernate的Criteria API来精确描述每个人所说的可能是其最可能的用例,应用复杂的搜索条件。问题是,我想查询的表不是完全由原始值组成,而是部分来自其他对象,我需要查询这些对象的ID。Hibernate的Criteria API是否仍然不支持嵌套关系

我从2年前发现this article,表明这是不可能的。下面是我如何尝试它无济于事,还有其他方面的Hibernate,我知道这种点符号在字符串文本中被支持以指示对象嵌套。

if (!lookupBean.getCompanyInput().equals("")) { 
     criteria.add(Restrictions.like("company.company", lookupBean.getCompanyInput() + "%")); 
    } 

编辑:

这是我为实现我试图上面,使用从下面的第一个答案的建议正确分解代码;注意,我甚至使用附加个createCriteria来电订购一个属性在另一个相关联的对象/表:

if (!lookupBean.getCompanyValue().equals("")) { 
    criteria.createCriteria("company").add(
      Restrictions.like("company", lookupBean.getCompanyValue() + "%")); 
} 

List<TrailerDetail> tdList = 
     criteria.createCriteria("location").addOrder(Order.asc("location")).list(); 

不能完全确定我按照你的榜样,但它肯定可以对相关的实体指定过滤条件,只需通过嵌套条件对象来形成一棵树。举例来说,如果我有一个名为订购有许多对一个关系到用户实体的实体,我能找到的所有订单名为弗雷德用这样的查询用户:

List<Order> orders = session.createCriteria(Order.class) 
    .createCriteria("user") 
     .add(eq("name", "fred")) 
    .list(); 

如果你正在谈论一个与自己有关系的实体,那也应该是一样的。如果您需要过滤关联对象的ID,您也可以用“id”替换“name”。

+2

+1。尽管如此,您想要注意ID,具体取决于映射,可能不需要(甚至不合法)创建嵌套标准以通过ID查询关联。因此,在上面的例子中,你可以使用'session.createCriteria(Order.class).add(eq(“user.id”,25))。list()' – ChssPly76 2009-08-14 19:18:24

+0

我要补充的是,如果你有一个引用到Java代码中的关联对象,您也可以将实体对象本身作为参数传递给Restrictions.eq调用(例如Restrictions.eq(“user”,user))而不是ID。使用Session.load(User.class,)可以轻松获得此类引用,而无需支付性能损失。 – 2009-08-14 19:28:14

+0

感谢您的建议。没有对相关对象的引用。我可能会编辑我的问题以指示可以使用的替换代码。但是如果你需要的话,你会如何嵌套多个Criteria?我不需要,但那可能是有问题的。如果你只需要嵌套一个,虽然它可能是你最后的东西你坚持原来的标准。 无论如何,谢谢!我刚刚用一个StringBuffer替换了几十行构建HQL查询的代码,大约少于10行。 – 2009-08-14 19:35:08