【问题标题】:Does Hibernate's Criteria API still not support nested relationsHibernate 的 Criteria API 是否仍然不支持嵌套关系
【发布时间】:2010-11-19 18:04:18
【问题描述】:

我想将 Hibernate 的 Criteria API 准确地用于每个人都说可能是它最可能的用例,应用复杂的搜索条件。问题是,我要查询的表并不完全由原始值组成,而是部分来自其他对象,我需要查询这些对象的 id。

我发现两年前的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();

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    不完全确定我是否按照您的示例进行操作,但可以通过嵌套 Criteria 对象以形成树来在关联实体上指定过滤条件。例如,如果我有一个名为 Order 的实体与 User 实体具有多对一关系,我可以通过查询找到名为 Fred 的用户的所有订单像这样:

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

    如果您谈论的是与自身有关系的实体,那也应该有效。如果您需要过滤关联对象的 ID,也可以将“name”替换为“id”。

    【讨论】:

    • +1。但是,您要小心使用 ID - 根据映射,可能没有必要(甚至合法)创建嵌套条件来通过 id 查询关联。因此,在上面的示例中,您将使用 session.createCriteria(Order.class).add(eq("user.id", 25)).list()
    • 我要补充一点,如果您在 Java 代码中有对关联对象的引用,您还可以将实体对象本身作为参数传递给 Restrictions.eq 调用(例如 Restrictions.eq)。 eq("user", user)) 而不是 ID。您可以使用 Session.load(User.class, ) 轻松获得这样的参考,而无需支付性能损失。
    • 感谢您的建议有效。没有对关联对象的引用。我可能会编辑我的问题以指示有效的替换代码。但是,如果需要,您将如何嵌套多个 Criteria?我不需要,但这可能是有问题的。如果您只需要嵌套一个,尽管它可能应该是您添加到原始标准的最后一件事。不管怎样,谢谢!我刚刚用 StringBuffer 替换了几十行构建 HQL 查询的代码,大约不到 10 行。
    • 实际上再想一想,您可能只是总是在原始条件后面加上您需要的任何其他嵌套条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多