我是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过滤,那么如何避免这个
答案 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