gpt4 book ai didi

mysql - 带有可选参数的 JpaRepository

转载 作者:行者123 更新时间:2023-11-29 02:17:06 24 4
gpt4 key购买 nike

我有一个像这样的客户的 MySQL 表:

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

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

例如,多个搜索参数的预期结果:

Name      | Country       Result
--------------------------------
John | (not set) first table line
(not set) | (not set) all entries
(not set) | a line one and two (case insensitive)

我知道我可以创建如下查询:
findByNameAndByCountry( @Param("name") String name, @Param("country") String country);
但在应用程序中我有七个搜索参数。因为没有必要全部指定,所以有 128 种不同的搜索,我不想实现。

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

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 = '' 检查参数是否为空,但由于某种原因,这不起作用。

我还对每个参数使用 IF(:param != '', c.param, '%') LIKE %:param% 进行了测试,遗憾的是结果相同。

奇怪的是,如果我直接在我的数据库上尝试这个命令它工作得很好,但不是 JpaRepository。

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

最佳答案

尝试使用适当的 like 格式使用 concat

    "SELECT c FROM customer c WHERE "
+ "(:name = '' OR c.name LIKE concat('%', :name ,'%'') "
+ "AND (:country = '' OR c.country LIKE concat ('%', :country, '%'')"

关于mysql - 带有可选参数的 JpaRepository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37858239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com