我为这样的客户提供了一个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。
有人知道为什么这不起作用。或者我的问题是否有更好的解决方案,我没有想到?感谢您的帮助:)
答案 0 :(得分:2)
尝试使用concat
之类的正确形式 "SELECT c FROM customer c WHERE "
+ "(:name = '' OR c.name LIKE concat('%', :name ,'%'') "
+ "AND (:country = '' OR c.country LIKE concat ('%', :country, '%'')"