Java 如何查询JPA中值为空的列?

Java 如何查询JPA中值为空的列?,java,jpa,Java,Jpa,我使用JPA namedQuery从数据库中选择数据 @NamedQuery(name = "Concept.findByRefTableNull", query = "SELECT c FROM Concept c WHERE c.conceptName = :conceptName and c.refTable = :refTable"), /// List<Concept> attributeList = em.createNamedQu

我使用JPA namedQuery从数据库中选择数据

 @NamedQuery(name = "Concept.findByRefTableNull", query = "SELECT c FROM Concept c WHERE c.conceptName = :conceptName and c.refTable = :refTable"),

///
 List<Concept> attributeList 
                = em.createNamedQuery("Concept.findByRefTableNull")
                .setParameter("conceptName", "student").
                setParameter("refTable", null).
                getResultList();

        System.out.println(attributeList.size()); //return 0
@NamedQuery(name=“Concept.findByRefTableNull”,query=“从概念c中选择c,其中c.conceptName=:conceptName和c.refTable=:refTable”),
///
列表属性列表
=em.createNamedQuery(“Concept.findByRefTableNull”)
.setParameter(“概念名”、“学生”)。
setParameter(“refTable”,null)。
getResultList();
System.out.println(attributeList.size())//返回0
列表大小为0,但我确信它应该有记录。原因是refTable。如何查询JPA中值为空的列


谢谢。

只需将您的查询更改为

 @NamedQuery(name = "Concept.findByRefTableNull", query = "SELECT c FROM Concept c WHERE c.conceptName = :conceptName and c.refTable IS NULL"),

我将完全避免查询——它几乎否定了持久性抽象的意义。而是通过创建动态查询,这将确保可移植性,并且您将能够在某种程度上切换数据库,而无需太多麻烦

我不确定这是否只是Spring数据JPA功能,但我只是在表单findByFieldName(类型字段)的存储库接口中编写了一个方法其中fieldName是我需要进行空检查的列的名称。然后我使用此方法并将null作为参数传递。

您可以使用Criteri Api,如下所示:

private Specification<Object> nullData(String field) {
    return (root, query, cb) ->
            cb.isNull(cb.lower(root.get(field)));
}
专用规范nullData(字符串字段){
返回(根、查询、cb)->
isNull(cb.lower(root.get(field));
}

拥有JPQL查询仍然是一个抽象层,允许您在使用条件时切换数据库。当参数数据类型为基本数据类型时,这将不起作用。@Raj是的,这就是为什么大多数人建议不要对实体类中的字段使用基本数据类型的原因。然而,对于原语,需要定义默认值,例如整数为0或-1,并让JPA搜索它。