编写具有多个子元素限制的Hibernate Criteria API查询

时间:2011-04-20 20:03:13

标签: java sql hibernate criteria

我有一个看起来像这样的数据模型(简化示例):

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

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

我正在尝试使用Criteria API在数据库中搜索包含AddressLines特定组合的地址。例如,要检索包含地址行{(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()

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

我之前发现过类似的问题,但没有人接受或投票回答。

1 个答案:

答案 0 :(得分: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限制。