【问题标题】:Writing a Hibernate Criteria API Query with restrictions for multiple sub-elements编写具有多个子元素限制的 Hibernate Criteria API 查询
【发布时间】:2011-04-20 20:03:12
【问题描述】:

我有一个如下所示的数据模型(简化示例):

public class Address { private List<AddressLine> addressLines; }

public class AddressLine { private String value; private String type; }

我正在尝试使用 Criteria API 在数据库中搜索包含特定地址行组合的地址。例如,要检索包含地址行 {(type="CITY", value="London"), (type="COUNTRY", value="GB")} 的所有地址。我找不到任何此类查询的示例。

据我所知,是根据单个 AddressLine 查询地址。

session.createCriteria(Address.class) .createCriteria("addressLines") .add(Restrictions.and(Restrictions.eq("type", type), Restrictions.eq("value", value))).list()

如果我为第二个地址行添加限制,休眠生成的 SQL 基本上是询问 SELECT x WHERE x.y = 'a' AND x.y = 'b' 所以永远不会返回任何结果。

我发现以前有人问过类似的问题,但没有一个问题被接受或投票给答案。

【问题讨论】:

    标签: java sql hibernate criteria


    【解决方案1】:

    您需要编写等效于

    的 Criteria
    select a from Address a where 
        exists (select line1.id from AddressLine line1 where line1.address.id = a.id 
                                                         and line1.type = 'CITY'
                                                         and line1.value = 'London')
        and exists (select line2.id from AddressLine line where line2.address.id = a.id 
                                                            and line2.type = 'COUNTRY'
                                                            and line2.value = 'GB')
    

    这意味着为每个子查询编写一个 DetachedCriteria,带有一个 id 投影,并使用这些分离的条件作为两个 Subqueries.exists() 调用的参数。主条件中地址实体的别名可用于分离条件中,实现line1.address.id = a.id限制。

    【讨论】:

    • 我不知道如何把它变成标准(我是 Hibernate 的新手)。今天我会多研究一下文档。我也发现这个问题非常相似。它没有回答问题,但有一些代码 sn-ps 可以帮助实现您的解决方案。但是,这些代码 sn-ps 不显示 exists() 调用。 stackoverflow.com/questions/3001136/…
    • 我链接的答案中提出的可能解决方案遭受以下异常:org.hibernate.QueryException:重复关联路径
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多