1111import org .springframework .data .repository .query .Param ;
1212
1313public interface RecordRepository extends JpaRepository <RecordEntity , Long > {
14+ /*
15+ SELECT * FROM cft_records
16+ WHERE id = ? AND profile_id = ?
17+ */
1418 Optional <RecordEntity > findByIdAndProfileId (Long id , Long profileId );
19+ /*
20+ SELECT * FROM cft_records
21+ WHERE profile_id = ?
22+ */
1523 List <RecordEntity > findByProfileId (Long profileId );
16- @ Query (
17- value = """
18- SELECT r.* FROM cft_records r
19- JOIN cft_categories c ON c.id = r.category_id
20- WHERE r.profile_id = :profileId
21- AND (:keyword IS NULL OR LOWER(r.name) LIKE :keyword)
22- AND (:type IS NULL OR LOWER(c.type) = :type)
23- AND (CAST(:categoryId AS BIGINT) IS NULL OR r.category_id = :categoryId)
24- AND (CAST(:dateStart AS DATE) IS NULL OR r.date >= :dateStart)
25- AND (CAST(:dateEnd AS DATE) IS NULL OR r.date <= :dateEnd)
26- AND (CAST(:priceLow AS NUMERIC) IS NULL OR r.price >= :priceLow)
27- AND (CAST(:priceHigh AS NUMERIC) IS NULL OR r.price <= :priceHigh)
28- """ ,
29- countQuery = """
30- SELECT COUNT(*) FROM cft_records r
24+ /*
25+ SELECT r.* FROM cft_records r
3126 JOIN cft_categories c ON c.id = r.category_id
32- WHERE r.profile_id = :profileId
33- AND (:keyword IS NULL OR LOWER(r.name) LIKE :keyword)
34- AND (:type IS NULL OR LOWER(c.type) = :type)
35- AND (CAST(:categoryId AS BIGINT) IS NULL OR r.category_id = :categoryId)
36- AND (CAST(:dateStart AS DATE) IS NULL OR r.date >= :dateStart)
37- AND (CAST(:dateEnd AS DATE) IS NULL OR r.date <= :dateEnd)
38- AND (CAST(:priceLow AS NUMERIC) IS NULL OR r.price >= :priceLow)
39- AND (CAST(:priceHigh AS NUMERIC) IS NULL OR r.price <= :priceHigh)
40- """ ,
41- nativeQuery = true
27+ WHERE r.profile_id = ?
28+ AND (? IS NULL OR LOWER(r.name) LIKE LOWER(CONCAT('%', ?, '%')))
29+ AND (? IS NULL OR c.type = ?)
30+ AND (? IS NULL OR c.category_id = ?)
31+ AND (? IS NULL OR r.date >= ?)
32+ AND (? IS NULL OR r.date <= ?)
33+ AND (? IS NULL OR r.price >= ?)
34+ AND (? IS NULL OR r.price <= ?)
35+ ORDER BY ? ASC/DESC
36+ LIMIT ? OFFSET ?
37+ */
38+ @ Query (
39+ """
40+ SELECT r FROM RecordEntity r
41+ WHERE r.profile.id = :profileId
42+ AND (:name IS NULL OR LOWER(r.name) LIKE LOWER(CONCAT('%', :name, '%')))
43+ AND (:type IS NULL OR r.category.type = :type)
44+ AND (:categoryId IS NULL OR r.category.id = :categoryId)
45+ AND (:dateStart IS NULL OR r.date >= :dateStart)
46+ AND (:dateEnd IS NULL OR r.date <= :dateEnd)
47+ AND (:priceLow IS NULL OR r.price >= :priceLow)
48+ AND (:priceHigh IS NULL OR r.price <= :priceHigh)
49+ """
4250 )
4351 Page <RecordEntity > search (@ Param ("profileId" ) Long profileId ,
4452 @ Param ("keyword" ) String keyword ,
@@ -49,20 +57,31 @@ Page<RecordEntity> search(@Param("profileId") Long profileId,
4957 @ Param ("priceLow" ) BigDecimal priceLow ,
5058 @ Param ("priceHigh" ) BigDecimal priceHigh ,
5159 Pageable pageable );
52- @ Query (
53- value = """
54- SELECT r.* FROM cft_records r
60+ /*
61+ SELECT r.* FROM cft_records r
5562 JOIN cft_categories c ON c.id = r.category_id
56- WHERE r.profile_id = :profileId
57- AND (:type IS NULL OR LOWER(c.type) = :type)
58- AND (CAST(:dateStart AS DATE) IS NULL OR r.date >= :dateStart)
59- AND (CAST(:dateEnd AS DATE) IS NULL OR r.date <= :dateEnd)
60- AND (CAST(:priceLow AS NUMERIC) IS NULL OR r.price >= :priceLow)
61- AND (CAST(:priceHigh AS NUMERIC) IS NULL OR r.price <= :priceHigh)
62- AND (:skipCategories = true OR r.category_id IN (:categories))
63- AND (:keyword IS NULL OR LOWER(r.name) LIKE :keyword)
64- """ ,
65- nativeQuery = true
63+ WHERE r.profile_id = ?
64+ AND (? IS NULL OR c.type = ?)
65+ AND (? IS NULL OR r.date >= ?)
66+ AND (? IS NULL OR r.date <= ?)
67+ AND (? IS NULL OR r.price >= ?)
68+ AND (? IS NULL OR r.price <= ?)
69+ AND (? IS NULL OR r.category_id IN (?, ...))
70+ AND (? IS NULL OR LOWER(r.name) LIKE LOWER(CONCAT('%', ?, '%')))
71+ */
72+ @ Query (
73+ """
74+ SELECT r FROM RecordEntity r
75+ WHERE r.profile.id = :profileId
76+ AND (:type IS NULL OR r.category.type = :type)
77+ AND (:dateStart IS NULL OR r.date >= :dateStart)
78+ AND (:dateEnd IS NULL OR r.date <= :dateEnd)
79+ AND (:priceLow IS NULL OR r.price >= :priceLow)
80+ AND (:priceHigh IS NULL OR r.price <= :priceHigh)
81+ AND (:#{#categories == null || #categories.isEmpty()} = true
82+ OR r.category.id IN :categories)
83+ AND (:name IS NULL OR LOWER(r.name) LIKE LOWER(CONCAT('%', :name, '%')))
84+ """
6685 )
6786 List <RecordEntity > searchAll (@ Param ("profileId" ) Long profileId ,
6887 @ Param ("type" ) String type ,
0 commit comments