【问题标题】: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 查找。

希望我描述清楚。

【问题讨论】:

标签: java spring-boot spring-data-jpa jpql


【解决方案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 的贡献者

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多