当某些字段可能为null时,我可以将对象用作JPA中标准的谓词



我有一个对象,我们将其称为人:

@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;
.
.
.

我想使用谓词将此对象用作滤波器上的过滤器,但是当某些输入OBJ为null(例如,昵称)时,它会打破查询。这是我目前拥有的代码的示例。

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"}]

在此示例中,我想把每个人都放在人桌上:这个人的名字是鲍勃,年龄是30岁否则这个人的名字是威廉,昵称是比尔

对不起,如果此示例有点不清楚,我已经更改了代码,以使其尽可能容易地转换为其他示例。在过去的几个月中,我对JPA的了解通常是基本的,它是自学教学的(阅读,Google)。对此的任何帮助将不胜感激。谢谢!

,您要说的是要应用标准,如果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!如果他们可能是,您必须相应地防止!

最新更新