Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- OIDC
- LPOS
- R2DBC Paging
- 애자일 싫타
- hbase 저장공간 설정
- 논블록킹 성능
- fake jwt
- nGinder
- 개발 어렵당.ㅠ
- pinpoint
- jsonMarshaller
- UnsupportedOperationException
- 플루터
- save/update
- 월급루팡 일지
- 오블완
- Ingress Controller Fake
- Armeria
- 노드간 통신
- 핀포인트
- reids
- RedirectService
- intellij
- ㅉ때
- jar 배포
- Loki 로그
- formik
- pinpoint 2.5.3
- 7879
- 티스토리챌린지
Archives
- Today
- Total
대머리개발자
R2DBC 동적 쿼리는...쥐쥐s 본문
728x90
# 동적 쿼리를 쓰기에는 아직 무리가 보인다.
public interface UserRepository extends R2dbcRepository<User, Long> {
Mono<User> findByEmail(String email);
@Query("select * from user limit :#{[0]} ,:#{[1]}")
Flux<User> findAllPaging(int offset, int limit);
}
어여 JPA 만큼 올러와야 하는데.. 뜨뜻미지근한 느낌이다. ㅎㅎ 좋다면서?? 왜?
사용자 이름으로 검색을 하려 했더니...새롭게 interface를 추가하는 방법 말고는 없네.
날짜 조건에.. 기타 조건 넣고 빼고 하면.... 멘붕s 오겠다..
@Query("select * from user where name like :#{[0]} limit :#{[1]} ,:#{[2]}")
Flux<User> findByNameLikePaging(String name, int offset, int limit);
일단 간단하니깐 로직에서 분기 태우자... 방법을 알려줘요..
시간이 없으매!
with QueryDsl -> ㅋㅋ
https://velog.io/@jhvictor4/R2DBC-QueryDsl-%EA%B0%99%EC%9D%B4-%EC%93%B0%EA%B8%B0-Webflux0
R2DBC & QueryDsl 같이 쓰기 - Webflux(0)
Webflux + R2DBC 스택에 대해 공부하고 있습니다.본 게시글은 이해도가 성숙되기 전, 삽질(?) 로그를 담고 있어 그다지 유익하지 않을 수도 있습니다. 😂https://github.com/infobip/infobip-spring-data-queryd
velog.io
일단 DatabaseClient 로 Try!!!
private String buildQuery(Map<String, String> param, String baseQuery) {
StringBuffer baseSql = new StringBuffer(baseQuery);
if(param.containsKey(Constants.NAME)){
baseSql.append( " AND name = :name ");
}
if(param.containsKey(Constants.NICKNAME)){
baseSql.append( " AND nickname = :nickname ");
}
if(param.containsKey(Constants.EMAIL)){
baseSql.append( " AND email LIKE :email");
}
if(param.containsKey(Constants.MOBILE)){
baseSql.append( " AND mobile = :mobile");
}
if(param.containsKey(Constants.FROM)){
baseSql.append( " AND createDate >= :from");
}
if(param.containsKey(Constants.TO)){
baseSql.append( " AND createDate <= :to");
}
baseSql.append( " ORDER BY createDate DESC");
baseSql.append( " LIMIT :pageIndex , :pageSize" );
return baseSql.toString();
}
private DatabaseClient.GenericExecuteSpec bindParametersToExecuteSpec(Map<String, String> param, String query) {
DatabaseClient.GenericExecuteSpec executeSpec = databaseClient.sql(query)
.bind(Constants.STATE,param.get(Constants.STATE));
if(param.containsKey(Constants.NAME) && !param.get(Constants.NAME).isBlank()){
executeSpec = executeSpec.bind( Constants.NAME, param.get(Constants.NAME));
}
if(param.containsKey(Constants.EMAIL) && !param.get(Constants.EMAIL).isBlank() ){
executeSpec = executeSpec.bind( Constants.EMAIL, param.get(Constants.EMAIL) + "@%");
}
if(param.containsKey(Constants.NICKNAME) && !param.get(Constants.NICKNAME).isBlank()){
executeSpec = executeSpec.bind(Constants.NICKNAME, param.get(Constants.NICKNAME));
}
if(param.containsKey(Constants.FROM) && !param.get(Constants.FROM).isBlank()){
executeSpec = executeSpec.bind(Constants.FROM, param.get(Constants.FROM));
}
if(param.containsKey(Constants.TO) && !param.get(Constants.TO).isBlank()){
executeSpec = executeSpec.bind(Constants.TO, param.get(Constants.TO));
}
if(param.containsKey(Constants.MOBILE) && !param.get(Constants.MOBILE).isBlank()){
executeSpec = executeSpec.bind(Constants.MOBILE, param.get(Constants.MOBILE));
}
executeSpec = executeSpec.bind("pageIndex", param.getOrDefault("pageIndex", "0"));
executeSpec = executeSpec.bind("pageSize", param.getOrDefault("pageSize", "10"));
return executeSpec;
}
public DatabaseClient.GenericExecuteSpec getQuery(Map<String, String> param, String baseQuery){
String query = buildQuery(param, baseQuery);
return bindParametersToExecuteSpec(param, query);
}
public Flux<UserGrpc.User> searchDynamicUserList(Map<String, String> param){
return getQuery(param, " SELECT uid, nickname, email, name, mobile, createDate FROM USER WHERE state = :state ")
.map( (row, metadata)-> {
String tell [] = row.get(Constants.MOBILE, String.class).split("-");
return UserGrpc.User.newBuilder()
.setUid(row.get(Constants.UID, String.class))
.setNickname(row.get(Constants.NICKNAME, String.class))
.setEmail(row.get(Constants.EMAIL, String.class))
.setName(row.get(Constants.NAME, String.class))
.setMobile(tell[0] + "-****-" +tell[2])
.setCreateDate(row.get("createDate", ZonedDateTime.class).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
.build();
}).all();
}
public Mono<Long> countDynamicUserList(Map<String, String> param){
return getQuery(param, " SELECT count(1) cnt FROM USER WHERE state = :state ")
.fetch()
.one()
.map(row -> (Long)row.get("cnt"));
}
728x90
'개발이야기 > DataBase' 카테고리의 다른 글
게시판 코드에서...고민s (0) | 2023.10.24 |
---|---|
[R2DBC] 바인딩 (0) | 2023.09.13 |
R2DBC ...불행의 시작...(2) (0) | 2023.06.09 |
R2DBC ...불행의 시작... (1) | 2023.04.12 |
[우분투] 마리아DB 대/소문자 설정 (0) | 2023.03.07 |