JPA Query处理NULL参数值

时间:2015-02-17 04:46:47

标签: jpa

我是JPA的新手,这是我的查询之一,我有几个参数作为查询的一部分,任何参数都可以为null值

@Query(value = "SELECT ord.purchaseOrderNumber,ord.salesOrderNumber,ord.quoteNumber"

            + " FROM Order ord WHERE ord.purchaseOrderNumber LIKE :poNumber%  "
            + " AND ord.salesOrderNumber LIKE :soNumber "
            + " AND ord.quoteNumber = :quoteNumber "

上面的示例如果我的输入参数:quoteNumber为NULL则我不应该按ord.quoteNumber = NULL过滤,那么如何避免这个

5 个答案:

答案 0 :(得分:10)

你可以添加一组条件来"忽略"具有空值或空字符串的属性。

e.g。

+ " AND (ord.quoteNumber = :quoteNumber or :quoteNumber is null or :quoteNumber = '' ")

答案 1 :(得分:1)

不幸的是,= compare不能与空值一起使用,因为你有谓词IS NULL,IS NOT NULL。当quoteNumber为空时,您需要对案例进行不同的查询,这意味着什么。您可以在java代码中检查null,然后选择要调用的正确查询。 如果oder,引号不能是空字符串("")(它们不应该),那么你可以将缺少给定数字表示为空字符串并始终使用正常比较。请记住设置数据库架构,列不能为空,并且它们的默认值为""。 BTW您的列名称表示数字,但您正在使用字符串比较我希望它没问题。

答案 2 :(得分:0)

对于可为空的参数,您可以执行以下操作:

@Query(value = "SELECT ord.purchaseOrderNumber,ord.salesOrderNumber,ord.quoteNumber"
        + " FROM Order ord "
        + " WHERE (:poNumber is NULL OR ord.purchaseOrderNumber LIKE :poNumber)"
        + " AND (:soNumberis NULL OR ord.salesOrderNumber LIKE :soNumber)"
        + " AND (:quoteNumber is NULL OR ord.quoteNumber = :quoteNumber) "

答案 3 :(得分:0)

我们可以避免通过使用@Query注释并向JPQL语句添加一个小的复杂性来创建其他方法:

@Query("SELECT c FROM Customer c WHERE (:name is null or c.name = :name) and (:email is null"
  + " or c.email = :email)")
List<Customer> findCustomerByNameAndEmail(@Param("name") String name, @Param("email") String email);

请注意,如果:email参数为空:

:email is null or s.email = :email 那么该子句始终为真,因此不会影响整个WHERE子句。

让我们确保此方法有效:

List<Customer> customers = repository.findCustomerByNameAndEmail("D", null);
 
assertEquals(2, customers.size());

我们找到了两个名字为“ D”的客户,忽略了他们的电子邮件。

生成的JPQL WHERE子句如下:

其中(?为null或customer0_.name =?)和(?为null或customer0_.email =?) 通过这种方法,我们信任数据库服务器以识别关于我们的查询参数为null的子句,并优化查询的执行计划,以免产生显着的性能开销。对于某些查询或数据库服务器,尤其是涉及大量表扫描的数据库,可能会产生性能开销。

答案 4 :(得分:-1)

你可以使用这样的东西 :quoteNumber = -999 AND ord.quoteNumber =:quoteNumber

并在想要传递null时将-999传递给查询。

我试图看看你是否可以使用@parma

将其默认为-999