월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
List 형태의 검색조건에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요! 프로젝트 하다 궁금한 부분이 있는데 검색조건이 굉장히 많은 검색을 구현하게 되었어요. 조건이 PositionType positionType,List<String> majorSkillKeywords,String minorSkill,List<HopeWorkState> hopeWorkStates,List<PositionWorkManShip> positionWorkManShips 대강 이러한 파라미터들로 이루어지는데 단일 파라미터가 아닌 List 형태의 파라미터는 BooleanExpression을 활용한 메서드를 어떻게 구성해줘야 하는지 감이 잘 안잡혀요. BooleanExpression을 리스트 형태로 반환하는 형태의 메서드로 구성하면 되려나요? 예를들어 majorSkills 에 대해선 private List<BooleanExpression> eqMajorSkills(List<String> majorSkillKeywords) 이런 형태의 메서드로요. 맞는 방식인지도 모르겠네요ㅜㅜㅜ
- 해결됨실전! Querydsl
QMemberTeamDto의 NoClassDefFound
안녕하세요 강의 잘 듣고 있습니다. 중간에 조회 API 개발의 내용 중 QMemberTeamDto를 조회하는 메소드로 컨트롤러를 통해 응답을 주는 컨트롤러를 작성하는 내용이 있는데요 같은 내용의 Test는 통과하였으나 포스트맨에서 요청을 할 때는 NoClassDefFound 에러가 발생합니다 build가 되지 않았나? 해서 gradle로 clean compileJava compileQuerydsl 모두 실행하고 해봐도 같은 결과입니다 빌드된 결과 에러 내용
- 해결됨실전! Querydsl
DTO 클래스의 위치? 관련해서 질문 드립니다!
안녕하세요. 강의 너무나 잘 듣고 있어 언제나 감사드립니다. (_ _) DTO 관련해서 궁금점이 있어 질문드립니다. 제가 많이 본, 그리고 제가 지금도 쓰고있는 폴더 트리(패키지 구조)가 아래와 같이 사용하고 있습니다. - Model - | Repository - | Service - | Controller ▼ Service단의 경우에는 다른 서비스단에서 연계해서 사용될 수도 있다고 들은적이 있어서, 최대한 Model 클래스를 반환되도록 사용하고 있구요. 위와 연계해서 Controller단에서 Model 클래스를 DTO로 변환해서 반환을 했습니다. 그래서 DTO의 위치가 Controller 패키지에 위치시키고 있었습니다. 그런데 join 쿼리로 인해서 DTO를 Repository에서 반환하게 된다면, 해당 DTO의 위치가 맨 끝인 Controller 패키지에 있어도 되는 걸까요?
- 미해결실전! Querydsl
fetchJoin() 외에 Team 엔티티 가져오기
안녕하세요 강사님, 항상 좋은 강의 잘 듣고 있습니다! 강의에서 fetchJoin()을 했을때와 하지 않았을때의 차이는 앞서 수강했던 JPA 강의에서 학습을 했기 때문에 이해 했습니다. 강의를 수강하던 중, fetchJoin()을 사용하지 않고도 Team 엔티티를 가져올 수 있는 방법이 있을까 고민해본 결과, 아래의 코드가 나왔습니다. em.flush();em.clear(); Tuple findMemberJoinB = factory .select(member, team).from(member).join(member.team, team).fetchFirst();Team findTeamB = findMemberJoinB.get(1, Team.class);System.out.println("findTeamB = " + findTeamB); 실행 결과, Team 엔티티도 의도한대로 가져오고, 쿼리문도 fetchJoin을 사용 했을때와 동일하게 하나의 쿼리문만 처리되는 것을 확인 했습니다. ( select ...(생략)... from member member0_ inner join team team1_ on member0_.team_id=team1_.team_id limit 1; ) 이렇게 연관된 엔티티를 가져오는 것이 fetchJoin을 사용했을때와의 동일한 결과인 것이 맞나요? 혹시 이렇게 할 경우 생길 수 있는 오류가 있을까요? 답변 감사드립니다!
- 미해결실전! Querydsl
오타 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]딱히 수업내용과 상관없긴한데 id 'org.springframework.boot' version ‘2.2.2.RELEASE' 요 부분이 오타입니다. 뭐 어차피 스프링 부트가 만들어준 그대로 사용하기 때문에 크게 상관없을 것 같긴한데 플러그인 내용들을 전부 복사하는 경우 문제가 발생할것 같아 제보합니다. 해 당내용 : queryDsl => Gradle 전체 설정 plugins {id 'org.springframework.boot' version ‘2.2.2.RELEASE'id 'io.spring.dependency-management' version '1.0.8.RELEASE' id 'java' }
- 미해결실전! Querydsl
수정, 삭제 벌크 연산 관련 질문
querydsl로 수정, 삭제 벌크 연산을 하는 경우에 entityManager를 수동으로 flush, clear 하는 방법 이외에 스프링 데이터 jpa에서 어노테이션으로 사용하는 방식처럼 간단히 초기화하는 방법이 있을까요? @Modifying(clearAutomatically = true, flushAutomatically = true)
- 미해결실전! Querydsl
String 타입 동적 쿼리 작성하기
안녕하세요! 소중한 강의 열심히 보면서 공부하고 있습니다. 감사드립니다.😊 여러 변수로 나누어져 있는 Address 데이터들을 String 타입으로 모두 합친 뒤 클라이언트로부터 입력 받은 keyword로 where 절에서 검색기능을 하고 싶은데 String 타입에 contains() 함수를 사용하면 BooleanExpression 타입이 아닌 boolean 타입으로 반환값을 받아 컴파일 오류가 나는데 StringPath 타입이 아닌 String 타입으로 쿼리를 짜는 방법은 없을까요? //Address 클래스 //컴파일 오류 concat() 함수를 사용해봐았는데 쿼리문을 나가지만 원하는 데이터는 얻지 못했습니다. (아무런 데이터가 출력되지 않음) //sql where문
- 미해결실전! Querydsl
1:N 관계가 여러 개인 Entity를 Fetch join 하는법.
@Entity class A { @Id private Long id @ManyToOne @JoinColumn(name = "b_id") private B b } @Entity class B{ @Id private Long id @OneToMany(mappedBy = "b") private List<A> aList @ManyToOne @JoinColumn(name = "c_id") private C c } Entiy class C{ @Id private Long id @OneToMany(mappedBy = "c") private List<B> bList } 이런식으로 A -> B -> C 가 종속적으로 1:N 관계가 있을 때 하나의 querydsl 문으로 하나의 쿼리로 Table C에 있는 값을 가져오고 싶습니다. 즉 c.bList[0].aList[0].id <- a.id 나올수 있도록 만들고 싶은데 .selectFrom(c) .join(c.bList, b).fetchJoin() .join(b.aList, a).fetchJoin() .fetch() 를 하면 query 생성시 에러가 나옵니다. 혹시 다른 방법이 있나요?
- 미해결실전! Querydsl
QueryDsl은 왜 엔티티를 직접 사용하지 않고 굳이 Q타입을 만들어서 사용하는 이유가 뭔가요?
제목 그대로 QueryDsl은 엔티티를 직접 이용해 쿼리를 작성하지 않고 Q 타입을 생성하여 Q타입을 사용하는 이유가 무엇인가요?
- 해결됨실전! Querydsl
profile 인식 방법
server.port: 8080spring: config.activate.on-profile: local output.ansi.enabled: always datasource: url: jdbc:h2:tcp://localhost/~/test_db# url: jdbc:h2:tcp://localhost:9092/~/test_db # datasource url? ??? ?? ??? ? ??? ?? JVM ?? H2 DB? JPA? ???? ??. username: sa password: driver-class-name: org.h2.Driver jpa: database-platform: H2 hibernate.ddl-auto: create properties: hibernate:# show_sql: true format_sql: true use_sql_comments: true # querydsl JPQL? ??? ? console? ???? ????logging.level: org.hibernate.SQL: debug org.hibernate.type: trace 1) 이렇게 작성하고 실행했는데No active profile set, falling back to 1 default profile: "default"이런 표현이 콘솔에 뜨는데, 스프링 시작할 때, 자바 코드로 profile 설정해주는 거 말고는 방법이 없는 건가요? 왜 인식이 안 되는지 모르겠네요. test는 local 대신 test로 바꾼 거 말고는 똑같은데...2) profile 개념을 공부하면서 한 가지 궁금한 게 생겼는데 여쭤봐도 될까요? profile을 설정 안 하면 default 프로파일이 되고, default는 apllication.yml이 선택된다고 구글링을 통해 알게 되었습니다. 근데 여기서 궁금한 게, default로 application.yml이 선택되면 application.yml의 속성이 적용되어야 하는 거 아닌가요? 예를 들어, 전 application.yml에 output.ansi.enabled=true 로 설정했는데, 콘솔에 색이 입혀지지가 않아서요.. 이건 왜 그런 건가요?
- 해결됨실전! Querydsl
querydsl and(,) or 처리 질문있습니다.
a,b,c.or(d)제가 원하는 쿼리는 (a) and (b) and (c ) or (d)인데 실제 쿼리는(a) and (b) and (c or d)이렇게 쿼리문이 나갑니다. 어떻게 해야할까요? 개별 괄호는 쳐도 다 생략이 되고 (a,b,c).or(d)이렇게도 불가한데 BooleanExpression으로는 제가 원하는 방식을 사용할 수 없을까요?
- 미해결실전! Querydsl
p6spy 두번 쿼리 나가는 문제
p6spy 설정 그대로 했는데, 같은 쿼리가 두번 나가는데요 이 문제를 해결할 수는 없나요?
- 미해결실전! Querydsl
sum에 if문을 사용할 수 있나요?
안녕하세요 강의를 들으면서, querydsl을 적용하여 프로젝트를 만들고 있습니다. 현재 만드는 프로젝트에서 a, b 케이스의 카운트와 a케이스만의 카운트, b케이스만의 카운트 a, b 케이스의 총합과 a케이스만의 총합, b케이스만의 총합을 구하려고 합니다. 카운트의 경우, eq()로 조건을 걸어서 원하는 값으로 추출이 가능한 것 같은데 총합의 경우, 전체 총합의 경우 외에 if문같은 조건을 구하는 방법을 구글링해보아도 확인할 수 없어서 질문드립니다. ueryFactory.select(income.count().as("totalCase"), income.isAcupuncture.eq(true).count().as("acupunctureCase"), income.isAcupuncture.eq(false).count().as("medicineCase"), income.amount.sum().as("totalAmount"), select count(case when is_acupuncture = 1 then 0 end) as acupunctureCase, sum(if(is_acupuncture = 0, amount, 0)) as medicineAmount, <<<<<<<< sum(amount) as totalAmount from income where income.patient_id = 4; querydsl에서도 sum 문법에 if문으로 처리하는 방법이 있을까요?
- 미해결실전! Querydsl
컴파일 관련 에러
test 중에 계속 1. HikariPool-1 - Exception during pool initialization. 2.2022-04-10 22:13:08.388 ERROR 10156 --- [ main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 3.2022-04-10 22:13:08.382 WARN 10156 --- [ main] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata 4.022-04-10 22:13:08.388 WARN 10156 --- [ main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 이러한 에러가 뜹니다... 구글링을 해봐도 yml 문제도 아닌거같고 알려주시면 감사하겠습니다..
- 미해결실전! Querydsl
db h2 관련 오류입니다 ㅠㅠ
mv 파일만드려고 먼저 이렇게 했을때는 연결이 되는데 table 생성을 위해서 embeded로 tcp;localhost주소로 연결하게되면 이런식으로 연결 자체가 안되는데 도저히 원인을 모르겠습니다... 다른 프로젝트는 또 연결이 되고 제각각으로 에러만 발생하네요 ㅠㅠ
- 미해결실전! Querydsl
applyPagination 메소드 관련 질문입니다.
JPAQuery를 raw 타입으로 쓰지 말고 <T>를 붙여서 쓰면 더 좋지 않나요? protected <T> Page<T> applyPagination(Pageable pageable, Function<JPAQueryFactory, JPAQuery<T>> contentQuery) { JPAQuery<T> jpaQuery = contentQuery.apply(getQueryFactory()); List<T> content = getQuerydsl().applyPagination(pageable, jpaQuery).fetch(); return PageableExecutionUtils.getPage(content, pageable, jpaQuery::fetchCount);}
- 해결됨실전! Querydsl
Sort 질문있습니다.
Querydsl 4RepositorySupport에 Sort를 처리해주는 로직이 없는데 이건 따로 구현해야하는건가요? Querydsl4RepositorySupport에서 @Autowiredpublic void setEntityManager(EntityManager entityManager) { Assert.notNull(entityManager, "EntityManager must not be null!"); JpaEntityInformation entityInformation = JpaEntityInformationSupport.getEntityInformation(domainClass, entityManager); SimpleEntityPathResolver resolver = SimpleEntityPathResolver.INSTANCE; EntityPath path = resolver.createPath(entityInformation.getJavaType()); this.entityManager = entityManager; this.querydsl = new Querydsl(entityManager, new PathBuilder<>(path.getType(), path.getMetadata())); this.queryFactory = new JPAQueryFactory(entityManager);} 이 부분이 스프링 데이터에서 제공하는 Pageable안에 있는 Sort를 사용할 수 잇도록 설정한 것이라고 하셨는데 그럼 MemberTestRepository에서 public Page<Member> applyPaginationWithSort(MemberSearchCondition condition, Pageable pageable) { return applyPagination(pageable, contentQuery -> contentQuery .selectFrom(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe()))) .orderBy(pageable.getSort());} 와 같이 pageable.getSort()로 Sort값을 가져와 orderBy절에서 사용하면 되는건지 궁금합니다
- 미해결실전! Querydsl
다른 스키마 테이블 조인
querydsl로 현업하고 있는데 궁금한 사항이 있습니다. querydsl은 다른 스키마에 있는 테이블끼리 조인하고 싶은 경우에 사용이 불가능한가요?
- 미해결실전! Querydsl
querydsl cannot find symbol
현재 build.gradle 설정인데 어떻게 고치더라도 cannot find symbol 에러가 발생합니다 (Q파일이 생성이 안됩니다, 폴더까지 모두 생성이 안됩니다) 도움 부탁드립니다! //querydsl 추가buildscript { ext { queryDslVersion = "5.0.0" }}plugins { id 'org.springframework.boot' version '2.6.4' id 'io.spring.dependency-management' version '1.0.11.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java'}group = 'team'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' //querydsl 추가 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.6.3' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') { useJUnitPlatform()}//querydsl 추가 시작def querydslDir = "$buildDir/generated/querydsl"querydsl { jpa = true querydslSourcesDir = querydslDir}sourceSets { main.java.srcDir querydslDir}configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath}compileQuerydsl { options.annotationProcessorPath = configurations.querydsl}//querydsl 추가 끝
- 해결됨실전! Querydsl
동적쿼리 합칠때 NPE 에러
안녕하세요. 영한님 이전 강의와 질문게시판을 보며 BooleanExpression 조건들을 and 혹은 or 로 묶을수있는 장점이 있다는것을 보았습니다. 그런데 NULL 체크가 따로 필요하다고 하셨고 그에대한 답변으로 private Predicate allEq(String usernameParam, Integer ageParam) { return usernameEq(usernameParam).and(ageEq(ageParam));}private BooleanBuilder usernameEq(String usernameParam) { if(usernameParam == null) return new BooleanBuilder(); return new BooleanBuilder(member.username.eq(usernameParam));}private BooleanBuilder ageEq(Integer ageParam) { return new BooleanBuilder(ageParam != null ? member.age.eq(ageParam) : null);} 이러한 형태로 null 을 확인하면 된다고 답변해주셨습니다. 그런데 이답변을 보면 기존 반환타입이 BooleanExpression 아닌 BooleanBuilder를 들어간것을 확인했습니다. BooleanExpression은 구현체 생성이 불가능하여 BooleanBuilder를 생성하신거 같은데 질문입니다. 1. 그럼 결과적으로 null 처리 까지 하기위해서는 where절 파라미터 사용시에 BooleanExpression 타입 대신 BooleanBuilder 를 반환타입으로 생성하는게 맞는건지 궁금합니다. 2. 제가 생각한 1번의 내용이 아니라면 BooleanExpression 타입을 이용했을때는 null체크를 어떤식으로 해야하는지 궁금합니다. 감사합니다!