월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! Querydsl
jakarta 환경에서 javax 클래스패스로 entityManager를 찾고있습니다.
실행환경gradle 7.6.1java 17, jdk19spring boot 3.0.2제일 처음 환경을 설정한 후 테스트하는 코드에서 아래와 같은 로그가 발생합니다.java: cannot access javax.persistence.EntityManager class file for javax.persistence.EntityManager not found import static org.assertj.core.api.Assertions.*; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import study.querydsl.entity.Hello; import study.querydsl.entity.QHello; @SpringBootTest @Transactional class QuerydslApplicationTests { @Autowired EntityManager em; @Test void contextLoads() { Hello hello = new Hello(); em.persist(hello); //현재 컴파일 에러가 나고 있는 부분 JPAQueryFactory query = new JPAQueryFactory(em); //em에서 javax.persistence.EntityManager 클래스를 찾을 수 없다는 에러가 나고 있음. QHello qHello = new QHello("h"); Hello result = query .selectFrom(qHello) .fetchOne(); assertThat(result).isEqualTo(hello); } }import문까지 모두 jakarta로 해주고 있습니다. 정상적으로 Q타입클래스가 되어있는데 JPAQueryFactory 생성자 부분의 에러가 전혀 사라지지 않습니다.버전문제인가 싶어서 여러번 버전을 확인했는데도, 제가 확인한 바로는 버전 호환에서는 문제 될 것이 없어보입니다.dataJPA가 3.0.X버전이상에서는 hibernate를 6+버전으로 맞춰줘야한다고 해서 확인해본 결과 hibernate는 다음과 같습니다.org.hibernate.orm:hibernate-core:6.1.7.Final추가적으로 build.gradle 코드를 올려놓겠습니다.plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' // == 스프링 부트 3.0 이상일 때, querydsl 의존성 == implementation "com.querydsl:querydsl-core:5.0.0" implementation "com.querydsl:querydsl-collections" implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta") annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api:3.1.0" testImplementation ('org.springframework.boot:spring-boot-starter-test') testImplementation 'jakarta.persistence:jakarta.persistence-api' testImplementation 'com.querydsl:querydsl-jpa:5.0.0' } tasks.named('test') { useJUnitPlatform() } //querydsl 세팅 시 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl }
- 해결됨실전! Querydsl
동적 정렬(orderBy)처리중 페이징 문제가 발생했는데 해결해주실 수 있을까요?ㅠㅠ
개인 프로젝트를 진행하며 querydsl을 사용하여 동적 쿼리문을 작성했습니다. 무한스크롤 페이징 처리를 하였고, 코드의 일부분만 보여드리면 아래와 같습니다.public ArticlePagingResponse<Article> searchDynamicQueryAndPaging(Long lastArticleId, ArticleSearchCond cond, String orderBy, int size) { JPAQuery<Article> query = new JPAQuery<>(em); query.from(article) .join(article.member,member)//article.member는 Article테이블에 있는 member_id, member는 Member테이블에 있는 id라고 생각 .join(article.restaurant, restaurant)//article.restaurant는 Article테이블에 있는 restaurant_id, restaurant는 Restaurant테이블에 있는 id .fetchJoin() .where( // no-offset 페이징 처리 ltStoreId(lastArticleId), // 검색조건들 생략... ); //정렬 동적 처리 switch(orderBy){ case OrderConst.CREATED_DATE_DESC://최신 순으로 정렬 query.orderBy(article.createdDate.desc()); break; case OrderConst.CREATED_DATE_ASC://오래된 순으로 정렬 query.orderBy(article.createdDate.asc()); break; case OrderConst.VIEWS_DESC://조회수 순으로 정렬 query.orderBy(article.views.desc(),article.createdDate.desc()); break; case OrderConst.LIKE_COUNT_DESC://좋아요 갯수 순으로 정렬 query.leftJoin(likeArticle) .on(article.id.eq(likeArticle.article.id)) .groupBy(article.id) .orderBy(likeArticle.count().desc(),article.createdDate.desc()); break; case OrderConst.COMMENT_COUNT_DESC://댓글 갯수 순으로 정렬 query.leftJoin(comment) .on(article.id.eq(comment.article.id)) .groupBy(article.id) .orderBy(comment.count().desc(),article.createdDate.desc()); break; default: throw new IllegalStateException("OrderConst에 정의되어있는 orderBy값 외의 다른 값이 들어왔습니다."); } List<Article> results = query .limit(size + 1) .fetch();//size를 DB에서 받는 것보다 프론트에서 받는게 더 유연할 것같음.fetch(); boolean hasNext = false; if (results.size() > size) {//결과가 6개이면 size(5)보다 크므로 다음 페이지가 있다는 의미 hasNext = true; results.remove(size - 1);//다음 페이지 확인을 위하 게시글을 하나더 가져왔으므로 확인 후 삭제 } return new ArticlePagingResponse<>(results,hasNext); }코드를 보면 no-offset방식으로 구현을 하였습니다. whrer문의 lastArticleId 값을 받고 그것보다 작은 값중에 5개씩 받도록 처리하였습니다.예) 10, 9, 8, 7, 6 의 게시글을 받고 그다음 스크롤 이벤트가 발생하면 6보다 작은 값 중에서 5개인 5, 4, 3, 2, 1 을 가져 오는 것입니다.문제는 최신순으로 정렬하여 값을 가져오면 최신 게시글의 id값이 가장 크므로 잘 작동하는데 다른 정렬 조건(오래된 순, 조회수순, 좋아요 갯수순, 댓글 갯수순) 으로 가져올 때는 id값의 순서를 예상하지 못하니때문에 정렬이 되지않는 문제가 발생하였습니다.오래된 순은 id값을 lt 대신에 gt쓰고 어떻게 구현할 수 있을 것같은데 다른 정렬 조건(조회수순, 좋아요순, 댓글순)은 어떻게 구현할 좋은 방법이 생각 나질 않네요 방법을 아시는 분 계시면 알려주시면 감사하겠습니다.
- 해결됨실전! Querydsl
오라클 함수
안녕하세요 영한님 강의 너무 잘 들었습니다.저희 팀에서 스프링 데이터 jpa, querydsl을 사용해서 프로젝트를 할 예정입니다.db는 오라클을 사용할 건데요jpa나 querydsl에서 오라클 함수나 프로시저등을 사용 할 수 있는 방법이 있을까요?jpa, querydsl을 제가 해야 될 것 같아서 조금 긴장되네요답변부탁드립니다.찾아보니 가능한것 같습니다~
- 미해결실전! Querydsl
정렬을 했을때 몇번째 raw인지 조회
안녕하세요 만약에 시험 점수를 관리하는 테이블이 있다면 그 시험점수를 기반으로 순위를 매길려고 할때정렬된 테이블 중에서 제가 가져온 raw가 테이블에서 몇번째로 값이 높은 raw인지 알 수 있는 키워드는 없나요? 설령 없다면 해당 비즈니스 로직은 어떻게 처리를 해줘야 될까요?
- 미해결실전! Querydsl
안녕하세요 프로젝트 실행 문의 드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]영한쌤 강의를 쭉 따라서 들어왔는데요. 그동안의프로젝트와는 다르게 왜 이번 querydsl 편은 프로젝트 생성후 실행시 그냥 폴더 자체를 선택하는게 아니라 build.gradle 파일을 선택후 오픈해야 하나요?? 또 그렇게 build.gradle 파일 한개만 선택해서 오픈했는데 일반 프로젝트 폴더를 여는것처럼 main부터 test및 다른 파일 모두가 있는건가용??? 그리고 왜 querydsl폴더 자체를 선택후 열면 파일구조는 모두 똑같은데 활성화가 안되는지 궁금합니다
- 미해결실전! Querydsl
동시성 문제 관련
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의중에 스프링과 EntityManager를 함께 쓰면 트랜잭션 단위로 라우팅 되기 때문에 동시성 문제가 발생하지 않는다고 설명해주셨습니다. 그렇다면 , dirty checking을 이용한 조회수 증가와 같은 update 쿼리를 날릴 때에도 동시성 문제가 발생하지 않는지 여쭤보고 싶습니다.
- 미해결실전! Querydsl
벌크연산
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]질문 1.벌크 연산시em.clear 을 해주는데 이때 원치 않는영속성 컨텍스트의 값을 clear 하는 경우는 없나요 ? 그리고 벌크 연산시 flush,clear을 해주는 이유가영속성 컨텍스트와 디비 정보를 일치하게 만들어 줄려고 하는건데만약에 벌크연산 트랜잭션 안에 따로 벌크연산말고 다른 코드가 없으면 em.flush, em.clear 코드기 필요 없는데 습관처럼 안전하게 넣는다고 생각하면 되는건가요? ==============================질문 2.querydsl 은 업데이트할떄 때로findbyid 를 할 필요가 없는건가요 >?
- 미해결실전! Querydsl
강의 left 조인
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]join문에서영한님은 join_on3번(아래) 처럼 사용하셨고저는 join_on2 번처럼 사용했는데동일하다고 생각해도 되는건가요 ?결과는 똑같이나옵니다
- 미해결실전! Querydsl
반환타입
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]repository에서 반환 타입을 Tuple이 아닌바로 DTO타입으로 받아서 사용해도 무관한가요 ?
- 미해결실전! Querydsl
영속성 컨텍스트에서 값을 찾아오지 않음
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]해당 강의 06:09 에 작성된 테스트가 실패합니다.당연히 성공할 것으로 생각한 테스트가 실패하여 원인을 찾아보려 하였으나, 잘 찾아지지 않네요 ㅠ 영속성 컨텍스트 1차 캐시에 있는 member를 가져오지 않고 실제 쿼리를 수행하여 동일한 pk 를 지닌 member를 조회해 가져오는데, Entity Manager 가 clear 될만한 조건이 발견되지 않습니다.직접 디버깅을 따라가보려 하였으나, 이 부분도 쉽지 않네요ㅠㅠ해결할만한 검색 키워드 정도만 주셔도 감사하겠습니다!MemberJpaRepository
- 미해결실전! Querydsl
querydsl 외래키제약조건
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/)[질문 내용]JPA를 사용하는데외래키를 설정안하고 사용하는 경우가 있을까요? 제 질문은 A테이블 과 B테이블이 부모 자식 관계인데외래키 제약조건을 걸지 않고 사용하는 경우입니다. JPA에선 각 엔티티가 연결고리가 없는 경우입니다A엔티티(B엔티티로 가는 필드없음)B엔티티 (A엔티티로 가는 필드없음)이런식으로
- 해결됨실전! Querydsl
테스트 메서드 이름은 왜 스네이크 인가요??!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.자바는 보통 카멜케이스를 쓴다고 알고 있고,영한님도 메서드명이나 클래스명에 카멜케이스를 그동안 쓰셨던거 같은데테스트 메서드는 왜 스네이크로 쓰시나요??코드가 달라지는 건 아니지만.. 궁금해서요 전에 영한님이 클라이언트도 다 한국이면 한글로도 쓰기도 한다고 하셨던거같은데..테스트는 스네이크로 쓰는 것이 국룰인가요?!
- 미해결실전! Querydsl
조인을 통해서 값을 가고올 수 있는거는 알겠습니다
근데 만약QMemberTeamDto에List<String> 형식이 있을 땐이 값을 어떻게 해야 갖고올 수 있는 건가요?
- 미해결실전! Querydsl
build관련 질문드립니다.
안녕하세요 영한님.스프링 입문 로드맵부터 지금까지 정말 좋은 강의 감사합니다.로컬에서는 compileQuerydsl도 정상적으로 작동되고 Q클래스도 잘 생성 되는데 결국에 배포를 하기 위해서는 build를 해야 하는데 해당 부분에서 계속 문제가 생겨서 질문드립니다.아래는 설정파일입니다.querydsl관련 중복 에러만 발생하여 다른 라이브러리는 제외하고 해당 부분만 올렸습니다. buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '3.0.3' id 'io.spring.dependency-management' version '1.1.0' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'heyuniverse' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.persistence:jakarta.persistence-api" annotationProcessor "jakarta.annotation:jakarta.annotation-api" } tasks.named('test') { useJUnitPlatform() } def querydslDir = "$buildDir/generated/querydsl" clean { delete file(querydslDir) } querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl }distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip아래는 배포를 위해 build시 발생하는 에러 로그입니다.> Task :compileJava FAILEDDeprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.See https://docs.gradle.org/7.6/userguide/command_line_interface.html#sec:command_line_warnings3 actionable tasks: 3 executedFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':compileJava'.> Compilation failed; see the compiler error output for details.Attempt to recreate a file for type xxxx.xxxx.QClassAttempt to recreate a file for type xxxx.xxxx.QClassAttempt to recreate a file for type xxxx.xxxx.QClassAttempt to recreate a file for type xxxx.xxxx.QClass인텔리제이 ,gradle 양쪽 다 캐쉬 삭제 후 실행 해봐도 결과는 같았고,gradle 버전이 문제인가 하여 8.0으로 업그레이드 해봐도 해결이 되지는 않았습니다.이틀 넘게 종일 매달려봐도 도무지 질문할 곳이 없어서 남겨봅니다 ,,
- 미해결실전! Querydsl
DTO .as 질문입니다
다른 분이 올린 질문이랑 같은 내용입니다.5분 30초정도에 생성자 방식으로 했기 때문에 as쓸 필요 없이 타입만 맞으면 된다고 하는데, 제가 Projections.constructor로 실험해봤는데member.id.as("asdasd") 이렇게 넣어도 잘 작동하는데이거에 대한 이유를 알고 싶습니다
- 해결됨실전! Querydsl
3분 10초 질문입니다
@Data를 무조건 써야되는 건가요?@Setter는 웬만하면 사용 안 하는게 좋다고 들었는데@Setter가 없으면 Condition값이 파라미터로 안 넘어옵니다..해결 방법이 있을까요?
- 해결됨실전! Querydsl
nullSafeBuilder메서드를 통해 null처리의 한계
개인 프로젝트를 진행하던중 where절의 조건들을 체이닝하는 과정에서 아래코드를 보면 경우 제일 앞에있는 nameLike()메서드가 null일 경우 에러가 발생하였습니다. and 조건일 경우 , 로 체이닝하면 되었지만 or조건들은 무조건 or()을 통해 연결을 해주어야했습니다.query.selectFrom(member) .where(nameLike("infren").or(nameEq("김영한강사님"))) .fetch();BooleanBuilder를 통해 조건을 처리해도되지만인프런 게시판을 통해알게된 nullSafeBuilder메서드를 만들어서 null처리를 하는 방법을 알게되었습니다. 하지만 몇가지 한계점들을 발견하였습니다.eq문에 null이 들어갈 경우에는 정상적으로 작동하였으나like절, 또는 in절에는 상황에 따라서 null을 넣을 경우 like,in문 자체가 파라미터로 null을 받지 못함으로 인해서 eq와는 다르게 작동하는 것을 발견하였습니다.몇 가지 경우의 테스트를 진행해보았습니다.eq절에 null을 넣을경우like절에 null을 넣을 경우 -> NullPointerExceptionin절에 String타입의 null을 넣을 경우in절에 String[] 타입의 null을 넣을 경우in절에 List<> 타입의 null을 넣을 경우 -> NullPointerExceptionin절에 객체(Team) null을 넣을 경우@Test void eq에Null을넣을때(){ String name = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.eq(name))) .fetch(); assertEquals(findMember.size(),4); } @Test() void like절에_Null을_넣을때(){ String name = null; assertThrows(NullPointerException.class, () -> { List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.like(name))) .fetch(); }); } @Test void in절에_String타입의_Null을_넣을때(){ String name = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.in(name))) .fetch(); assertEquals(findMember.size(),4); } @Test void in절에_String배열타입의_Null을_넣을때(){ String name = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.username.in(name))) .fetch(); assertEquals(findMember.size(),4); } @Test void in절에_List에_Null을_넣을때(){ List<Team> team = null; assertThrows(NullPointerException.class, () -> { List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.team.in(team))) .fetch(); }); } @Test void in절에_Team타입의_Null을_넣을때(){ Team team = null; List<Member> findMember = query.selectFrom(member) .where(nullSafeBuilder(()-> member.team.in(team))) .fetch(); assertEquals(findMember.size(),4); } public static BooleanBuilder nullSafeBuilder(Supplier<BooleanExpression> f) { try { return new BooleanBuilder(f.get()); } catch (IllegalArgumentException e) { return new BooleanBuilder(); } }where절안에서 사용하는 함수(like, in...등등)에 따라 파라미터 자체에 null을 받지 못함으로인해 nullSafeBuilder를 통해 해결할 수 없는 경우도 있는것 같습니다.이러한 경우에는 강사님께서 알려주셨던 아래와 같은 방법으로 메서드를 통해 파라미터의 null처리를 해주고private BooleanExpression nameLike(String name){ return name != null ? member.username.like(name) : null; }체이닝할 때는 and조건이면 , 를 사용하고, or조건으로 체이닝을 해야할 경우에는 BooleanBuilder객체에 체이닝하는 방식으로 구현을 해야할 것 같습니다.아래는 프로젝트에 적용했던 동적쿼리문 입니다. 앞서 말했듯이 and조건은 ,로 연결하고 or조건들은 Booleanbuilder객체에 체이닝을 하였습니다.//페이징 처리를 하지않은 동적쿼리문 -> 테스트에서 사용 public List<Article> searchBooleanBuilder(ArticleSearchCond cond) { BooleanBuilder builder = new BooleanBuilder(); builder.or(contentLike(cond.getContent()))//글 내용 keyword검색 .or(nickNameLike(cond.getWriter()))//작성자(닉네임) keyword검색 .or(nameLike(cond.getWriter()))//작성자(이름) keyword검색 .or(tagArticleIn(cond.getArticlesByTagValue()))//태그 keyword검색 .or(restaurantNameLike(cond.getRestaurantName()));//음식점명 keyword검색 return query.selectFrom(article) .where( followMembersIn(cond.getFollowMembers()),//팔로우한 유저로 검색 sidoEq(cond.getSido()),//시도로 검색 sigoonEq(cond.getSigoon()),//시군으로 검색 dongEq(cond.getDong()),//동으로 검색 latitudeBetween(cond.getLatitude()),//위도로 검색 longitudeBetween(cond.getLongitude()),//경도로 검색 categoryEq(cond.getCategory()),//음식점 카테고리로 검색 likeArticleIn(cond.getLikeArticles()),//좋아요누른 게시판 검색 builder//keyword조건 검색 ) .orderBy(article.id.desc())//아이디가 높은 것(최신순)으로 내림차순 .limit(20) .fetch(); }아래는 nullSafeBuilder의 한계를 모른 상태로 구현하였던 에러가 발생하는 코드입니다. radioBtnSearchCond(and조건들), keywordSearchCond(or조건으로 연결)안에 nullsafeBuilder로 null처리한 메서드들이 있습니다. public List<Article> searchByNullSafer(ArticleSearchCond cond) { return query.selectFrom(article) .where( radioBtnSearchCond(cond)//라디로 버튼 검색 조건들 .and(keywordSearchCond(cond))//keyword로 검색 조건들 ) .orderBy(article.id.desc())//아이디가 높은 것(최신순)으로 내림차순 .fetch(); }혹시 nullSafeBuilder를 구현 좋은 방법이 있던가, 다른 좋은 방법을 아시는 분이 있으면 알려주시면 감사하겠습니다.
- 해결됨실전! Querydsl
Intellij IEDA 빌드로 querydsl Qtype파일을 못찾겠네요
설정- 빌드,실행,배포- 빌드 도구- Gradle 에서'빌드 및 실행'을 Gradle(디폴트)로 설정하여, querydsl을컴파일하면왼쪽처럼 querydsl의 Qtype 파일의 소스 루트가 잘설정이되어서 문제가없는데 IntelliJ IDEA로 설정하면 오른쪽처럼, 소스 루트를 찾지못하고코드작성할때 QMemeber, QTeam의 루트또한 찾지못하고 오류를 해결하지못합니다 querydsl을 IntelliJ IDEA로 빌드하려면 어떻게해야할까요? bulid.gradle파일입니다plugins { id 'java' id 'org.springframework.boot' version '3.0.4' id 'io.spring.dependency-management' version '1.1.0' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8' implementation 'org.springframework.boot:spring-boot-starter-validation' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { useJUnitPlatform() }
- 미해결실전! Querydsl
querydsl bulk연산 수행시 join조건
안녕하세요! Querydsl강의를 들으며 직접개발을해보며 적용해보고 있습니다!근데 예제에 나와있지 않고 궁금증이 해소되지 않아 질문 남기게 되었습니다.bulk연산 수행시 join 조건을 사용할 수 없나요?member에서 그 전에 활동한 내역이 있는 사람이면, haveBeenActive값을 모두 true로 만들고 싶습니다..(member의 email정보는 unique해서 식별자로 같은 사람인지 인식하게 했습니다)2023-03-24 07:45:35.099 ERROR 33353 --- [nio-8080-exec-1] o.s.m.i.c.GlobalExceptionHandler : [Unknown Error] : null이러한 오류가 납니다..bulk연산 수행할때 join을 사용할 수 없나요?계속해서 골머리를 앓다가 질문 남깁니다..감사합니다!public void 함수(Integer activityNum) { val member = QMember.member; val sub_member = new QMember("sub"); // 자기 자신과 join queryFactory.update(member) .set(member.haveBeenActive, true) .where(member.activity.eq(activityNum) .and(member.id.eq( JPAExpressions.select(member.id) .from(member) .join(sub_member) .where(member.activity.between(1,activityNum - 1) .and(member.email.eq(sub_member.email))) .fetchOne() ))).execute(); }
- 해결됨실전! Querydsl
querydsl 동적쿼리 where문에 여러 메서드 사용 null처리 어떤식으로 하는게 좋을까요?
private List<Member> searchMember2(String usernameCond, Integer ageCond) { return queryFactory .selectFrom(member) .where(allEq(usernameCond,ageCond))//메서드를 만들어서 한번에 처리도 가능, 조립가능!! .fetch(); } private BooleanExpression usernameEq(String usernameCond) { return usernameCond != null ? member.username.eq(usernameCond) : null; } private BooleanExpression ageEq(Integer ageCond) { return ageCond != null ? member.age.eq(ageCond) : null; } private BooleanExpression allEq(String usernameCond, Integer ageCond){ return usernameEq(usernameCond).and(ageEq(ageCond)); }강사의 내용에서 알려주신 코드중 usernameEq메서드의 return값이 null일 때 어떤식으로 처리하는 것이 좋을까요???BooleanBuilder객체에 함수를 체이닝 할까 고민해봤지만 체이닝이 잘안되기도하고, BooleanBuilder를 사용할꺼면 usernameEq, ageEq와 같은 메서드를 만드는 의미가 없다고 생각아 합니다..... 좋은 방법있다면 알려주시면 감사하겠습니다.