繁体   English   中英

查询方法中的Spring JPA过滤器可选条件

[英]Spring JPA filter optional criteria in Query method

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

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

@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
);

我建议切换到JPA Criteria API 它将为您提供您正在寻求的额外灵活性(以及 JPQL 似乎最适合您的情况)。 您可以不受任何限制地以编程方式构建查询,最好的是它们被编译; 这意味着没有错别字将继续存在(这是在 JPQL 查询中跟踪的噩梦)。 此外,您可能希望使用JPA 元模型类 这为您的查询增加了更多的健壮性。 最后,您的存储库方法将如下所示:

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM