我有一个看起来像这样的数据模型(简化示例):
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'所以永远不会返回任何结果。
我之前发现过类似的问题,但没有人接受或投票回答。
答案 0 :(得分:1)
您需要编写等同于
的Criteriaselect 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
限制。