当某些字段可以为 NULL 时,我可以在 JPA 中使用对象作为 criteriaquery 的谓词吗?
Can I use an object as a predicate for criteriaquery in JPA when some fields can be NULL?
我有一个对象,我们称之为人:
@Entity
@Table(name = "PERSON")
public class Person extends PersistentObject {
@Id
@Column(name = "NAME")
private String name;
@Column(name = "AGE")
private String age;
@Column(name = "NICKNAME")
private String nickname;
@Column(name = "HAIR_COLOR")
private String hairColor;
.
.
.
我想使用此对象作为使用谓词的 CriteriaQuery 的过滤器,但是当某些输入 Obj 为 NULL(例如,NickName)时,它会中断查询。这是我目前拥有的代码示例。
public List<Person> getPeople(List<Person> peopleToGet)
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> e = cq.from(Person.class);
List<Predicate> predicates = new ArrayList<Predicate>();
for(Person person : peopleToGet)
{
predicates.add(cb.or(cb.and(
cb.equal(e.get("name"), person.getName()),
cb.equal(e.get("age"), person.getAge()),
cb.equal(e.get("nickname"), person.getNickname()),
cb.equal(e.get("hairColor"), person.getHairColor())
)));
.
.
.
当对象值不总是相同时,是否可以将对象用作过滤器?
示例输入:[{"name":"Bob","age":"30"},{"name":"William","nickname":"Bill"}]
在这个例子中,我想得到 PERSON table 中的每个人,其中:
这个人的名字是鲍勃,年龄是 30 岁
或者这个人的名字是 William AND 昵称是 Bill
抱歉,如果这个示例有点不清楚,我已经更改了代码以使其尽可能容易地转换为其他示例。总的来说,我对 JPA 的了解是基本的,充其量是过去几个月自学(阅读,Google)。对此的任何帮助将不胜感激。谢谢!!
根据您的说法,如果 bean 的相关 属性 不是 null
并且 不应用 [=24=,则您希望应用标准],如果属性 是 null
。为此,您必须创建一个列表,然后转换为数组以作为 and()
的参数(就像您对 List<Predicate> predicates
所做的那样):
for( Person person : peopleToGet ) {
List<Predicate> andPredicates = new ArrayList<>();
if( person.getName() != null ) andPredicates.add(cb.equal(e.get("name"), person.getName()));
if( /* similar code for the other properties */ ) /* ... */;
predicates.add(cb.or(cb.and( andPredicates.toArray(new Predicate[andPredicates.size()]) )));
}
上面的代码假设 Person
的 所有 属性都不是 null
!如果可能的话,你就得相应防范了!
我有一个对象,我们称之为人:
@Entity
@Table(name = "PERSON")
public class Person extends PersistentObject {
@Id
@Column(name = "NAME")
private String name;
@Column(name = "AGE")
private String age;
@Column(name = "NICKNAME")
private String nickname;
@Column(name = "HAIR_COLOR")
private String hairColor;
.
.
.
我想使用此对象作为使用谓词的 CriteriaQuery 的过滤器,但是当某些输入 Obj 为 NULL(例如,NickName)时,它会中断查询。这是我目前拥有的代码示例。
public List<Person> getPeople(List<Person> peopleToGet)
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> e = cq.from(Person.class);
List<Predicate> predicates = new ArrayList<Predicate>();
for(Person person : peopleToGet)
{
predicates.add(cb.or(cb.and(
cb.equal(e.get("name"), person.getName()),
cb.equal(e.get("age"), person.getAge()),
cb.equal(e.get("nickname"), person.getNickname()),
cb.equal(e.get("hairColor"), person.getHairColor())
)));
.
.
.
当对象值不总是相同时,是否可以将对象用作过滤器?
示例输入:[{"name":"Bob","age":"30"},{"name":"William","nickname":"Bill"}]
在这个例子中,我想得到 PERSON table 中的每个人,其中: 这个人的名字是鲍勃,年龄是 30 岁 或者这个人的名字是 William AND 昵称是 Bill
抱歉,如果这个示例有点不清楚,我已经更改了代码以使其尽可能容易地转换为其他示例。总的来说,我对 JPA 的了解是基本的,充其量是过去几个月自学(阅读,Google)。对此的任何帮助将不胜感激。谢谢!!
根据您的说法,如果 bean 的相关 属性 不是 null
并且 不应用 [=24=,则您希望应用标准],如果属性 是 null
。为此,您必须创建一个列表,然后转换为数组以作为 and()
的参数(就像您对 List<Predicate> predicates
所做的那样):
for( Person person : peopleToGet ) {
List<Predicate> andPredicates = new ArrayList<>();
if( person.getName() != null ) andPredicates.add(cb.equal(e.get("name"), person.getName()));
if( /* similar code for the other properties */ ) /* ... */;
predicates.add(cb.or(cb.and( andPredicates.toArray(new Predicate[andPredicates.size()]) )));
}
上面的代码假设 Person
的 所有 属性都不是 null
!如果可能的话,你就得相应防范了!