【问题标题】:How to find many item in one parameter Spring data jpa如何在一个参数中查找多个项目 Spring data jpa
【发布时间】:2020-04-03 05:06:48
【问题描述】:

我想对spring data jpa进行数据搜索,只有一个参数,但可以搜索多个项目。我有列表数据,像这样。

{
    "id": 105,
    "roomId": 43,
    "floor": "1",
    "roomNumber": "001",
    "description": "Normal",
    "status": "Vacant Clean"
},
{
    "id": 11,
    "bedTypeName": "King size"
},
{
    "id": 39,
    "categoryName": "President Suite"
}

我想按 roomNumber、bedTypeName 和 categoryName 进行搜索。但是,在一个参数中。例如,我有 @Param("roomNumber") 用于搜索 3 项。示例 "roomNumber":"001"then 按 rooomNumber 显示过滤器。示例"roomNumber":"king size" 然后按床型显示过滤器。示例"roomNumber":"president suite" 然后按类别名称显示过滤器。一个参数可以搜索多个项目。

这是我的仓库

@Query("select a,b.bedType,b.roomCategory from RoomDetail a left outer join RoomMaster b on a.roomId = b.id where lower(a.roomNumber) interests like %:roomNumber% OR interests LIKE %:bedTypeName% OR interests LIKE %:categoryName%")
Page<RoomDetail> findByRoomNumberBedTypeRoomCategor(
        @Param("roomNumber") String roomNumber, Pageable paging);

【问题讨论】:

  • 你看过我的回答了吗?只是好奇,...如果您发现有帮助/不必要/需要更新/不相关的答案,请告诉我。
  • @ShekharRai 谢谢先生..我自己找到了答案。它有效:)
  • 太好了。您也可以发布自己的答案并将您的答案标记为已接受,以便以后对其他人有所帮助
  • @ShekharRai 好的..你现在可以看看我的答案..我已经在我的帖子中添加了

标签: java mysql spring spring-data-jpa spring-data


【解决方案1】:

您是否尝试过通过 JpaRepository 接口使用自定义查询方法。使用自定义查询方法,您可以生成您的存储库,例如:

public interface RoomDetailRepository extends PagingAndSortingRepository<RoomDetail, Integer> { 
    Page<RoomDetail> findByRoomNumberOrBedTypeOrRoomCategoryContains(String search, Pageable pageable);}

您也可以在方法名称中包含排序关键字。

【讨论】:

    【解决方案2】:

    您可以使用Specification 而不是编写痛苦的查询和模糊的 JpaRepository 方法。

    JpaSpecificationExecutor

    首先在您的存储库接口中扩展 JpaSpecificationExecutor,

    interface RoomRepository extends JpaRepository<RoomDetail, Long>, JpaSpecificationExecutor<RoomDetail> {
        // your other queries
    }
    

    规格

    您需要创建规范来查找所需列上的值,

    public static Specification<RoomDetail> search(String value) {
        String search = "%" + value + "%";
        return (root, query, builder) -> builder.or(
                builder.like(root.get("roomNumber"), search),
                builder.like(root.get("bedTypeName"), search),
                builder.like(root.get("categoryName"), search)
        );
    }
    

    搜索 :)

    现在您可以在要搜索的地方使用它。

    Page<RoomDetail> filteredRooms = roomDetailRepository.findAll(search(value), paging);
    

    仅供参考

    当它查看roomNumber, bedTypeName, categoryName 列上的每个值时,如果相同的值 存在于不同的房间列中,可能会过滤多个房间,除非您有 唯一价值观

    | id  | roomid | floor | roomNumber | bedTypeName |  categoryName   |   description    |    status    |
    |-----|--------|-------|------------|-------------|-----------------|------------------|--------------|
    | 105 |     43 |     1 |        001 | Single      | Junior Suite    | Normal Size      | Vacant Clean |
    | 106 |     16 |     1 |        002 | Double      | Business Suite  | Couple Suitable  | Booked       |
    | 121 |     23 |     2 |        020 | King Size   | President Suite | Very comfortable | Vacant Clean |
    

    在上述情况下,如果您将Size 作为过滤器值,您将获得两个房间,因为 105 的 id 在 categoryName 列上具有 Normal Size 值,而 id 具有121 在您的 bedTypeName 列上有 King Size

    此外:要匹配确切的值,您可能需要使用 builder.equals 而不是 builder.like 更新搜索规范,但请确保在 value 之前和之后不应附加 % .

    探索

    1. Spring official documentation
    2. spring-data-criteria-queries
    3. spring-data-jpa-specification

    【讨论】:

      【解决方案3】:

      这样的答案..我自己找到了答案。它有效:)

           @Query("select a,b.bedType,b.roomCategory from RoomDetail a left outer join RoomMaster b on a.roomId = b.id where lower(a.roomNumber) like %:filter% "
              + "or lower(b.bedType.bedTypeName) like %:filter% "
              + "or lower(b.roomCategory.categoryName) like %:filter%")
        Page<RoomDetail> findByBedTypeOrRoomCategoryOrRoomNumber(@Param("filter") String Filter, Pageable paging); 
      

      【讨论】:

        猜你喜欢
        • 2022-01-12
        • 2018-03-18
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多