Hibernate 中的条件 API,加入时对同一列的多重限制 table
Criteria API in Hibernate, multiple restrictions for same column in joining table
我有 tables person
和 personDoc
如下:
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 进行搜索。
我使用别名加入了 person
和 persondoc
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
如果不查看 Person
和 PersonDoc
表是如何使用 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.and
和 Restrictions.or
实现相同的效果。
如果这没有帮助,请执行与 Person
和 PersonDoc
表相关的 post 个实体。
我有 tables person
和 personDoc
如下:
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 进行搜索。
我使用别名加入了 person
和 persondoc
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
如果不查看 Person
和 PersonDoc
表是如何使用 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.and
和 Restrictions.or
实现相同的效果。
如果这没有帮助,请执行与 Person
和 PersonDoc
表相关的 post 个实体。