当某些字段可以为 NULL 时,我可以使用对象作为 JPA 中条件查询的谓词吗?

Posted

技术标签:

【中文标题】当某些字段可以为 NULL 时,我可以使用对象作为 JPA 中条件查询的谓词吗?【英文标题】:Can I use an object as a predicate for criteriaquery in JPA when some fields can be NULL? 【发布时间】:2017-11-29 13:26:02 【问题描述】:

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

@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 表中的每个人,其中: 这个人的名字是鲍勃,年龄是 30 或者人名是威廉,昵称是比尔

对不起,如果这个例子有点不清楚,我已经更改了代码以使其尽可能容易地转换为其他例子。在过去的几个月里,我对 JPA 的一般知识是基本的,充其量是自学(阅读,谷歌)。对此的任何帮助将不胜感激。谢谢!!

【问题讨论】:

这里的representation 是什么? @Kalaiselvan对不起,我的错。我没有改变我所有的原始代码。出于保密原因,我更改了确切的代码并将我的对象替换为示例“Person”对象。我已经修好了,谢谢! 【参考方案1】:

根据您所说的,如果 bean 的相关属性不是 null 并且 不被应用,如果属性 ,您想要应用一个标准em>null。为此,您必须创建一个列表,然后转换为一个数组以作为and() 的参数(就像您对List&lt;Predicate&gt; 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!如果可能,您必须相应地防止这种情况!

【讨论】:

哦,我明白了....谢谢!我将对此进行测试并用结果更新问题。 这正是我想要的。这为我提供了一种更通用的方式来从数据库中获取我的数据,让我在某些事情上更加具体,而在其他事情上却非常广泛。谢谢!!

以上是关于当某些字段可以为 NULL 时,我可以使用对象作为 JPA 中条件查询的谓词吗?的主要内容,如果未能解决你的问题,请参考以下文章

编写高质量代码改善C#程序的157个建议——建议53:必要时应将不再使用的对象引用赋值为null

当涉及的字段之一为 NULL 时,MySQL 错误地允许重复条目

数据库字段为null时jdbc获取的值

在 MVC 中仅更新对象的某些字段的最佳方法是啥?

PostgreSQL order by 排序问题

我怎么能阻止JPA将embeddable对象设置为null只是因为它的所有字段都是null?