弹簧数据。使用多个字段进行搜索

Posted

技术标签:

【中文标题】弹簧数据。使用多个字段进行搜索【英文标题】:Spring Data. Search using many fields 【发布时间】:2019-02-26 16:17:42 【问题描述】:

我对 Spring Data JPA 中的搜索有疑问。我正在尝试写这样的东西:

List<UserDbo> findbyFirstNameAndLastName(String firstName, String LastName)

但我希望此请求所采用的值可能为空。

例如:

如果您在社交网络中进行搜索,您可以输入很多信息,例如:国家、城市、学校、名字和您找到的人,使用此参数,但您也可以只输入一两个参数,例如 firtNamecountry 并且您的查询仍然有效。

所以,我想创建一个查询方法,其中参数可以是可选为空。 在我的代码示例中,我想按 FirsName 和 Lastname,或仅按 FirstName 或仅按 LastName 查找。

希望我描述清楚。

【问题讨论】:

一般我需要通过传入的 UserDto 进行搜索,它可以有不同的参数集 也许你想要像 Query By Example 这样的东西? baeldung.com/spring-data-query-by-example 【参考方案1】:

这将不单独搜索名字和姓氏

假设在您的数据库中我们有

名字 - 姓氏

约翰威克

约翰·金

如果你搜索 findbyFirstNameAndLastName("john","");

你什么也得不到,因为查询就像 firstname=="john" AND lastname=="wick"

如果你想分开,你可以这样做:

List<UserDbo> findbyFirstName(String firstName);
List<UserDbo> findbyLastName(String lastName);

您可以对这些字符串进行空值检查并单独搜索

【讨论】:

是的,这个简单的查询很好,但在我的例子中,传入的 Dto 中有很多参数,比如:姓名、地址、Shool 和其他东西。所以我想使用我得到的所有参数进行搜索。如果您只有 FirstName 和 LastName,则很容易进行空检查并选择其中一个请求,但是如果您有很多参数,该怎么做呢?一般来说,我需要通过传入的 UserDto 进行搜索,它可以有一组不同的参数 哦,我现在明白了,您是否尝试过使用“或”类似的内容:findByUserNameOrLastname 您可以扩展它或城市或学校......等等。现在我们的查询将是 firstname=="john"或 lastname=="wick" 或.. 我正在尝试使用 Or,但如果我按 ("john", "wick") 搜索,我会得到:john wick 和 john king "附加接口携带的方法可以让你以多种方式执行Specifications。例如findAll方法将返回所有符合规范的实体:List findAll(Specification 规格);”我从 JPA 搜索了 google findBy 方法,它的用途是什么,我认为您应该查看此链接:docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/… 在 2.4 规范部分。【参考方案2】:

如果您只需要这 2 个字段(或几个附加字段),您可以使用原生查询:

@Query(value = "SELECT user FROM UserDbo user "
             + " WHERE (:firstName IS NULL OR user.firstName = :firstName)
             + " AND   (:lastName  IS NULL OR user.lastName  = :lastName)
      )       
List<UserDbo> find(@Param("firstName") String firstName, @Param("lastName") String lastName);

如果您的需求更大或不断变化,并且您需要根据输入条件动态构建查询,我建议调查spring-boot-starter-data-search。

你可以找到jpa的demo here


免责声明:我是 spring-boot-starter-data-search 的贡献者

【讨论】:

以上是关于弹簧数据。使用多个字段进行搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用弹簧批处理读取一个记录/项目并写入多个记录/项目

使用 PDO 准备语句从搜索字段中使用多个关键字进行 LIKE 查询

如何将排序添加到弹簧数据弹性搜索

如何使用弹簧数据在弹性搜索多过滤器中查找

带有谓词的弹簧数据 JPA 方法 findAll() - QueryDslPredicateExecutor

更新时未在返回的实体上设置标记为可更新 = 假的弹簧数据审核字段