弹簧数据。使用多个字段进行搜索
Posted
技术标签:
【中文标题】弹簧数据。使用多个字段进行搜索【英文标题】:Spring Data. Search using many fields 【发布时间】:2019-02-26 16:17:42 【问题描述】:我对 Spring Data JPA 中的搜索有疑问。我正在尝试写这样的东西:
List<UserDbo> findbyFirstNameAndLastName(String firstName, String LastName)
但我希望此请求所采用的值可能为空。
例如:
如果您在社交网络中进行搜索,您可以输入很多信息,例如:国家、城市、学校、名字和您找到的人,使用此参数,但您也可以只输入一两个参数,例如 firtName 和 country 并且您的查询仍然有效。
所以,我想创建一个查询方法,其中参数可以是可选为空。 在我的代码示例中,我想按 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如果您只需要这 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 查询