Queryメソッド春JPAフィルタオプションの基準

mslowiak:

私はいくつかの基準を使用してデータベースからデータをフィルタリングしたい(のは、それが8であると仮定します)。そして、クエリメソッドの下に良い方法でこれを行います。しかし、実際には、queryメソッドに渡されたこののcriteriasがnull(それはつまり、クエリを選択するために含めるべきではない意味)することができます。

どのように私はこのような状況に対処すべきか?それは良い方法ではありません - 私は実際にそれぞれのケースを処理するために、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
);
マルコ・R:

私はへの切り替えをお勧めしますJPA基準の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();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=207610&siteId=1