spring 在带有“in”条件的jpa查询中设置一个可选参数

rur96b6h  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(159)

我正在使用JPA执行下面给出的原生查询

  1. @Query(value="SELECT pintable.pin from pintable s
  2. where s.status=1
  3. and (:pincodes is null or ifnull(s.pincode,'') in (:pincodes)) "
  4. , nativeQuery = true)

字符串
对于可选的pincode(null),它工作得很好,对于单个pincode搜索也很好。当我使用多个值进行搜索时,得到如下错误。

  1. Caused by: org.hibernate.exception.DataException: JDBC exception executing SQL [SELECT pintable.pin from pintable s where s.status=1 and ((?,?) is null or ifnull(s.pincode,'') in (?,?))
  2. Caused by: java.sql.SQLException: Operand should contain 1 column(s)


请让我知道如何处理多值可选搜索。

fumotvh3

fumotvh31#

要在JPA中处理可选参数的多个值,特别是在使用IN子句时,您可能需要调整方法。解决此问题的一种方法是根据可选参数是null还是包含多个值来不同地处理可选参数。

  1. @Query(value = "SELECT pintable.pin FROM pintable s WHERE s.status = 1 " +
  2. "AND (:pincodes IS NULL OR ifnull(s.pincode, '') IN :pincodes)", nativeQuery = true)
  3. List<String> findByPincodes(@Param("pincodes") List<String> pincodes);

字符串
在您的调用代码中:
如果你想通过一个pincode查找,传递一个只包含那个pincode的列表。如果你想通过多个pincode查找,传递一个包含所有这些pincode的列表。
举例来说:

  1. List<String> singlePincode = Collections.singletonList("12345");
  2. List<String> multiplePincodes = Arrays.asList("12345", "56789");
  3. // For single pincode
  4. List<String> resultSingle = repository.findByPincodes(singlePincode);
  5. // For multiple pincodes
  6. List<String> resultMultiple = repository.findByPincodes(multiplePincodes);


这样,查询将处理两种情况:当pincode为null(忽略pincode条件)时,以及当它包含多个值时,适当地使用IN子句。根据您的特定用例和数据结构,根据需要调整代码。

展开查看全部

相关问题