Hibernate 中的条件 API,加入时对同一列的多重限制 table

Criteria API in Hibernate, multiple restrictions for same column in joining table

我有 tables personpersonDoc 如下:

person :

personNo
dateofBirth
firstname
LastName
MiddleName
salutationCode

personDoc :

personNo
doctype
documentNo

我必须搜索 name = "John" and (doctype = "passport" and documentNo = "XXXX') and (doctype = "Driving license" and documentNo= "YYYY")

我正在使用条件 API 进行搜索。

我使用别名加入了 personpersondoc table。

如何多次添加限制(针对相同的 table 和列)?

注意:对于更多场景,我需要像这样搜索:

名字像 "John" 的人和 (doctype = "passport" and documentNo = "XXXX') or (doctype = "Driving license" and documentNo= "YYYY").

您可以像下面这样实现:

Root<Person> r = cq.from(Person.class);
Root<PersonDoc> p = cq.from(PersonDoc.class);
cq.where(
   cb.and(
      cb.equal(r.get(Person_.name), "John"),     
      cb.or(
        cb.and(
           cb.equal(p.get(PersonDoc_.doctype), "passport"), 
           cb.equal(p.get(PersonDoc_.documentNo), "XXXX")
        ), 
        cb.and(
           cb.equal(p.get(PersonDoc_.doctype), "driverLicense"), 
           cb.equal(p.get(PersonDoc_.documentNo), "XXXX")
        )
      ),  
      cb.equal(p.get(PersonDoc_.person), r)
   );

要使用条件创建以下查询:

person with name like "John" and (doctype = "passport" and documentNo = "XXXX') or (doctype = "Driving license" and documentNo= "YYYY").

你可以试试 Criteria's Disjunction and Conjunction feature

如果不查看 PersonPersonDoc 表是如何使用 entity classes 映射的,则很难建立准确的标准。但我希望下面的例子能给你提示,你可以做到。

Disjunction disjunction = Restrictions.disjunction(); //OR condition

Conjunction conjunction1  = Restrictions.conjunction(); //AND condition
conjunction1.add(Restrictions.eq("doc.doctype", "passport"));
conjunction1.add(Restrictions.eq("doc.documentNo", "XXXX"));

Conjunction conjunction2  = Restrictions.conjunction(); //AND condition
conjunction2.add(Restrictions.eq("doc.doctype", "Driving License"));
conjunction2.add(Restrictions.eq("doc.documentNo", "YYYY"));

disjunction.add(conjunction1);
disjunction.add(conjunction2);

此析取可用于标准构建(作为示例):

session.createCriteria(Person.class, "p").createAlias(.., "doc").
add(Restrictions.and(Restrictions.like("p.name", "John"),   disjunction)).   
setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

添加了 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 以确保它 returns 只有不同的 Person 个实体。

请注意,我们也可以使用 Restrictions.andRestrictions.or 实现相同的效果。

如果这没有帮助,请执行与 PersonPersonDoc 表相关的 post 个实体。