@@ -43,7 +43,136 @@ public interface ExchangeRepository extends JpaRepository<Exchange, Long> {
4343 List <Exchange > findByUserWithItems (@ Param ("user" ) User user );
4444
4545 /**
46- * 작가의 상품에 대한 교환 요청 조회 (검색만 쿼리, 정렬은 메모리)
46+ * 작가의 상품에 대한 교환 요청 조회 (검색 + DB 정렬)
47+ * - 상품명 정렬 (ASC)
48+ */
49+ @ Query (value = "SELECT DISTINCT e FROM Exchange e " +
50+ "JOIN FETCH e.order o " +
51+ "JOIN FETCH e.user u " +
52+ "LEFT JOIN FETCH e.exchangeItems ei " +
53+ "LEFT JOIN FETCH ei.orderItem oi " +
54+ "LEFT JOIN FETCH oi.product p " +
55+ "WHERE p.user.id = :artistId " +
56+ "AND (:status IS NULL OR e.status = :status) " +
57+ "AND (:keyword IS NULL OR :keyword = '' OR " +
58+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
59+ " u.name LIKE CONCAT('%', :keyword, '%')) " +
60+ "ORDER BY p.name ASC" ,
61+ countQuery = "SELECT COUNT(DISTINCT e) FROM Exchange e " +
62+ "JOIN e.exchangeItems ei " +
63+ "JOIN ei.orderItem oi " +
64+ "JOIN oi.product p " +
65+ "WHERE p.user.id = :artistId " +
66+ "AND (:status IS NULL OR e.status = :status) " +
67+ "AND (:keyword IS NULL OR :keyword = '' OR " +
68+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
69+ " e.user.name LIKE CONCAT('%', :keyword, '%'))" )
70+ Page <Exchange > findExchangesByArtistSortedByProductNameAsc (
71+ @ Param ("artistId" ) Long artistId ,
72+ @ Param ("status" ) Exchange .ExchangeStatus status ,
73+ @ Param ("keyword" ) String keyword ,
74+ Pageable pageable
75+ );
76+
77+ /**
78+ * 작가의 상품에 대한 교환 요청 조회 (검색 + DB 정렬)
79+ * - 상품명 정렬 (DESC)
80+ */
81+ @ Query (value = "SELECT DISTINCT e FROM Exchange e " +
82+ "JOIN FETCH e.order o " +
83+ "JOIN FETCH e.user u " +
84+ "LEFT JOIN FETCH e.exchangeItems ei " +
85+ "LEFT JOIN FETCH ei.orderItem oi " +
86+ "LEFT JOIN FETCH oi.product p " +
87+ "WHERE p.user.id = :artistId " +
88+ "AND (:status IS NULL OR e.status = :status) " +
89+ "AND (:keyword IS NULL OR :keyword = '' OR " +
90+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
91+ " u.name LIKE CONCAT('%', :keyword, '%')) " +
92+ "ORDER BY p.name DESC" ,
93+ countQuery = "SELECT COUNT(DISTINCT e) FROM Exchange e " +
94+ "JOIN e.exchangeItems ei " +
95+ "JOIN ei.orderItem oi " +
96+ "JOIN oi.product p " +
97+ "WHERE p.user.id = :artistId " +
98+ "AND (:status IS NULL OR e.status = :status) " +
99+ "AND (:keyword IS NULL OR :keyword = '' OR " +
100+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
101+ " e.user.name LIKE CONCAT('%', :keyword, '%'))" )
102+ Page <Exchange > findExchangesByArtistSortedByProductNameDesc (
103+ @ Param ("artistId" ) Long artistId ,
104+ @ Param ("status" ) Exchange .ExchangeStatus status ,
105+ @ Param ("keyword" ) String keyword ,
106+ Pageable pageable
107+ );
108+
109+ /**
110+ * 작가의 상품에 대한 교환 요청 조회 (검색 + DB 정렬)
111+ * - 구매자 이름 정렬 (ASC)
112+ */
113+ @ Query (value = "SELECT DISTINCT e FROM Exchange e " +
114+ "JOIN FETCH e.order o " +
115+ "JOIN FETCH e.user u " +
116+ "LEFT JOIN FETCH e.exchangeItems ei " +
117+ "LEFT JOIN FETCH ei.orderItem oi " +
118+ "LEFT JOIN FETCH oi.product p " +
119+ "WHERE p.user.id = :artistId " +
120+ "AND (:status IS NULL OR e.status = :status) " +
121+ "AND (:keyword IS NULL OR :keyword = '' OR " +
122+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
123+ " u.name LIKE CONCAT('%', :keyword, '%')) " +
124+ "ORDER BY u.name ASC" ,
125+ countQuery = "SELECT COUNT(DISTINCT e) FROM Exchange e " +
126+ "JOIN e.exchangeItems ei " +
127+ "JOIN ei.orderItem oi " +
128+ "JOIN oi.product p " +
129+ "WHERE p.user.id = :artistId " +
130+ "AND (:status IS NULL OR e.status = :status) " +
131+ "AND (:keyword IS NULL OR :keyword = '' OR " +
132+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
133+ " e.user.name LIKE CONCAT('%', :keyword, '%'))" )
134+ Page <Exchange > findExchangesByArtistSortedByCustomerNameAsc (
135+ @ Param ("artistId" ) Long artistId ,
136+ @ Param ("status" ) Exchange .ExchangeStatus status ,
137+ @ Param ("keyword" ) String keyword ,
138+ Pageable pageable
139+ );
140+
141+ /**
142+ * 작가의 상품에 대한 교환 요청 조회 (검색 + DB 정렬)
143+ * - 구매자 이름 정렬 (DESC)
144+ */
145+ @ Query (value = "SELECT DISTINCT e FROM Exchange e " +
146+ "JOIN FETCH e.order o " +
147+ "JOIN FETCH e.user u " +
148+ "LEFT JOIN FETCH e.exchangeItems ei " +
149+ "LEFT JOIN FETCH ei.orderItem oi " +
150+ "LEFT JOIN FETCH oi.product p " +
151+ "WHERE p.user.id = :artistId " +
152+ "AND (:status IS NULL OR e.status = :status) " +
153+ "AND (:keyword IS NULL OR :keyword = '' OR " +
154+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
155+ " u.name LIKE CONCAT('%', :keyword, '%')) " +
156+ "ORDER BY u.name DESC" ,
157+ countQuery = "SELECT COUNT(DISTINCT e) FROM Exchange e " +
158+ "JOIN e.exchangeItems ei " +
159+ "JOIN ei.orderItem oi " +
160+ "JOIN oi.product p " +
161+ "WHERE p.user.id = :artistId " +
162+ "AND (:status IS NULL OR e.status = :status) " +
163+ "AND (:keyword IS NULL OR :keyword = '' OR " +
164+ " p.name LIKE CONCAT('%', :keyword, '%') OR " +
165+ " e.user.name LIKE CONCAT('%', :keyword, '%'))" )
166+ Page <Exchange > findExchangesByArtistSortedByCustomerNameDesc (
167+ @ Param ("artistId" ) Long artistId ,
168+ @ Param ("status" ) Exchange .ExchangeStatus status ,
169+ @ Param ("keyword" ) String keyword ,
170+ Pageable pageable
171+ );
172+
173+ /**
174+ * 작가의 상품에 대한 교환 요청 조회 (검색 + 기본 정렬)
175+ * - 주문일자, 상태 정렬 (Pageable로 처리)
47176 */
48177 @ Query (value = "SELECT DISTINCT e FROM Exchange e " +
49178 "JOIN FETCH e.order o " +
0 commit comments