생성자 + QueryProjection
@Data
@NoArgsConstructor
public class MemberDto {
private String username;
private int age;
@QueryProjection
public MemberDto(String username, int age) {
this.username = username;
this.age = age;
}
}
@Test
public void QueryProjection(){
List<MemberDto> result = queryFactory
.select(new QMemberDto(member.username, member.age))
.from(member)
.fetch();
for (MemberDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
그중 먼저 BooleanBuilder 에 대해서 알아보자.
문서의 설명으로는
BooleanBuilder (Querydsl 4.0.7 API)
BooleanBuilder is a cascading builder for Predicate expressions. BooleanBuilder is a mutable Expression implementation.
Predicate를 구현하는 구현체
쿼리의 조건 설정인 Where 뒤에 조건을 생성해주는 것
BooleanBuilder 사용 코드
@Test
public void dynamicQuery_BooleanBuilder() {
String usernameParam = "member1";
Integer ageParam = 10;
List<Member> result = searchMember(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember(String usernameCond, Integer ageCond) {
BooleanBuilder builder = new BooleanBuilder();
//if 문으로 이 조건을 만족하면 and문을 통해서 조건 추가
if(usernameCond != null){
builder.and(member.username.eq(usernameCond));
}
if(ageCond != null){
builder.and(member.age.eq(ageCond));
}
return queryFactory
.selectFrom(member)
.where(builder)
.fetch();
}
실무에서 사용하면 좋은 방법이다.
@Test
public void dynamicQuery_WhereParam(){
String usernameParam = "member1";
Integer ageParam = 10;
List<Member> result = searchMember2(usernameParam, ageParam);
assertThat(result.size()).isEqualTo(1);
}
private List<Member> searchMember2(String usernameCond, Integer ageCond) {
return queryFactory
.selectFrom(member)
.where(usernameEq(usernameCond),ageEq(ageCond))
.fetch();
}
private Predicate usernameEq(String usernameCond) {
return usernameCond != null ? member.username.eq(usernameCond) : null;
}
private Predicate ageEq(Integer ageCond) {
return ageCond != null ? member.age.eq(ageCond) : null;
}
where 조건에 null 은 무시된다.
메서드를 다른 쿼리에서도 재활용 가능.
조합이 가능해진다. -> 조합을 하기 위해서는 BooleanExpression을 사용해야한다.
private BooleanExpression allEq(String usernameCond, Integer ageCond) {
return usernameEq(usernameCond).and(ageEq(ageCond));
}
BooleanExpression은 querydsl에서 제공하는 기능으로 쿼리를 동적으로 생성하기 위해서 사용된다.
들어가서 보니 implement로 Predicate를 하고 있다.
executeUpdate() 메서드를 통해서 벌크 연산을 수행
@Test
@Commit
//트랜잭션이 테스트에 걸린경우 마지막에 전부 롤백시켜버려서 확인이 불가능함.
//그렇기 때문에 따로 Commit을 넣어서 남겨두기.
public void bulkUpdate(){
long count = queryFactory
.update(member)
.set(member.username, "비회원")
.where(member.age.lt(28))
.execute();
}
public void sqlFunction() {
queryFactory
.select(Expressions.stringTemplate("function('replace',{0},{1},{2})",
member.username, "member", "M"))
.from(member)
.fetchFirst();
}
특징
예시
-- 생성
CREATE FUNCTION myfunc
(
str VARCHAR(32)
)
RETURNS VARCHAR(32)
-- 문자열을 인식 받아 반대로 출력 (수행할 쿼리)
BEGIN
DECLARE result VARCHAR(32); -- 변수 선언
SET result = REVERSE(str1); -- 변수에 값넣기 SELECT 컬림 INTO 변수명 도 가능
RETURN result; -- 함수 호출시 반환할 리턴 값.
END;
--삭제
DROP FUNCTION myfunc;
참고 출처 : MySQL (13) - 프로시저(Procedure)와 함수(Function) (tistory.com)
MySQL 함수(Function) 만들기부터 조회까지 정리글 (tistory.com)