【问题标题】:Spring JPA filter optional criteria in Query methodSpring JPA过滤查询方法中的可选条件
【发布时间】:2019-09-29 02:16:38
【问题描述】:

我想从数据库中过滤掉几个标准的数据(假设它是 8 个)。 下面的查询方法很好地做到了这一点。但实际上,传递给查询方法的这个条件可以为空(这意味着不应该包含在选择查询中)。

我应该如何处理这种情况? 我真的不想让 n 方法来处理每个案例 - 这不是一个好方法。

@Query("SELECT NEW api.model.GeneralAnnouncementInfo(" +
        "an.id, an.title, po.price, SUBSTRING(an.description, 1, 100), an.provider, an.creationDate, an.url, l.lessorType, concat(loc.city, ' ', loc.district)) " +
        "FROM Announcement as an " +
        "LEFT JOIN an.priceOffer as po " +
        "LEFT JOIN an.lessor as l " +
        "LEFT JOIN an.location as loc " +
        "LEFT JOIN an.propertyData as pd " +
        "WHERE l.lessorType = (:lessor) " +
        "AND pd.roomNumber = (:rooms) " +
        "AND pd.bathroomNumber = (:baths) " +
        "AND pd.parkingAvailability = (:parking) " +
        "AND pd.isSmokingAllowed = (:smokers) " +
        "AND pd.isPetFriendly = (:pets) " +
        "AND pd.area = (:realPrice) " +
        "AND po.price = (:area) ")
Page<GeneralAnnouncementInfo> getAnnouncementsBySearchCriteria(Pageable pageable, 
                                                               String lessor,
                                                               String rooms,
                                                               String baths,
                                                               String parking,
                                                               String smokers,
                                                               String pets,
                                                               String realPrice,
                                                               String area
);

【问题讨论】:

  • WHERE :lessor IS NULL OR l.lessorType = (:lessor)?

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


【解决方案1】:

我建议切换到JPA Criteria API。它将为您提供您正在寻求的额外灵活性(并且 JPQL 似乎正在为您的案例最大化)。您可以不受任何限制地以编程方式构建查询,最好的事情是它们被编译;这意味着不会有任何拼写错误(这是在 JPQL 查询中跟踪的噩梦)。此外,您可能想使用JPA metamodel classes;这为您的查询增加了更多的稳健性。最后,您的存储库方法将如下所示:

private EntityManager em;

private Page<GeneralAnnouncementInfo> getAnnouncementsBySearchCriteria(QueryParameters qParams) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<SampleEntity> criteria = cb.createQuery(GeneralAnnouncementInfo.class);
    Root<GeneralAnnouncementInfo> root = criteria.from(GeneralAnnouncementInfo.class);

    // Programmatically build query details (conditions, joins, aggregations, translation, etc) 
    // ...
    // ...
    // ...


    return em.createQuery(criteria).getResultList();
}

【讨论】:

  • 这是一个不错的建议。这个解决方案看起来更简单,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 2021-09-18
  • 2018-06-27
  • 1970-01-01
  • 2015-05-26
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多