当一些字段可以为NULL时,我可以在JPA中使用对象作为criteriaquery的谓词吗?

时间:2017-11-29 13:26:03

标签: java rest jpa predicate criteriaquery

我有一个对象,我们称之为Person:

@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表中的每个人都在哪里: 人名是Bob,年龄为30岁 或者这个人的名字是威廉,绰号是比尔

很抱歉,如果这个例子有点不清楚,我已经更改了代码,以便尽可能简单地转换为其他示例。我对JPA的了解总体上是基本的,在过去的几个月里,他自学了(Read,Google)。对此的任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

根据您所说的,您希望应用标准,如果bean的相关属性不是null不应用,则属性 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!如果他们可能,你必须相应地防范这一点!