带有可选参数的Jpa​​Repository

时间:2016-06-16 11:45:34

标签: mysql spring-data spring-data-jpa jpql criteria-api

我为这样的客户提供了一个MySQL表:

BDD

在我的应用程序中,我想查询此表。用户可以指定不同的搜索字段,但不必设置每个值。 我在Repository Class中讨论查询,我想忽略空参数。

示例,多个搜索参数会产生什么结果:

name | country | many more columns
----------------------------------
John   USA
null   France
Max    null
null   null
...

我知道我可以创建如下的查询:
Name | Country Result -------------------------------- John | (not set) first table line (not set) | (not set) all entries (not set) | a line one and two (case insensitive)
但在应用程序中我有七个搜索参数。因为没有必要全部指定它们,所以有128种不同的搜索,我不想实现它们。

所以我的想法是像这样查询数据库:

findByNameAndByCountry( @Param("name") String name, @Param("country") String country);

问题是,这不起作用。如果我只使用public interface CustomerRepository extends JpaRepository<Customer, java.lang.String> { @Query("SELECT c FROM customer c WHERE " + "(:name = '' OR c.name LIKE %:name%) " + "AND (:country = '' OR c.country LIKE %:country%)") List<Customer> findByParams(@Param("name") name, @Param("country") country); } 检查参数,则无法获得预期结果,因为LIKE。但是,如果搜索参数为空,我还希望数据库条目具有空值。我尝试使用'%' != null检查参数是否为空,但由于某种原因,这不起作用。

我还使用:param = ''测试了每个参数,遗憾的是结果相同。

奇怪的是,如果我直接在我的数据库上尝试此命令,它可以正常工作,但不能使用JpaRepository。

有人知道为什么这不起作用。或者我的问题是否有更好的解决方案,我没有想到?感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

尝试使用concat

之类的正确形式
    "SELECT c FROM customer c WHERE "
      + "(:name = '' OR c.name LIKE concat('%', :name ,'%'') "
      + "AND (:country = '' OR c.country LIKE concat ('%', :country, '%'')"