30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
Page 대신 별도로 구현한 객체를 넘겨주고 있는데 문제가 되는 부분이 있을까요?
안녕하세요~page number가 0부터 시작하는 부분과 Page 자체에 너무 많은 정보가 있는 것 같아 필요한 값만 정의해둔 Dto를 response로 반환해주고 있습니다. (request도 별도로 정의한 dto 객체로 받고 있습니다.)그런데 강의에서 Page 자체를 Response로 반환해주는 것을 보고 현재 제가 하고 있는 방식대로 하면 문제가 될 부분이 있을 지 걱정이 되더라구요..혹시 주의해야하는 부분이 있을지, 이렇게 별도의 객체로 가공해서 넘겨줘도 문제가 없을지 걱정되어 질문드립니다. 😭감사합니다.
- 미해결실전! Querydsl
혹시 join 자체도 특정 조건에 따라 동적으로 작용되게 할 수 있나요?
안녕하세요.where 조건을 동적으로 생성해주는 부분에 대해서는 충분히 이해가 되었습니다.그런데 혹시 특정 condition 값에 따라 join을 해줘야하는 테이블이 다른 경우라면 어떻게 처리되어야 할지 모르겠어서 글을 남기게 되었습니다.condition조건에 teamName이 있을 때만 team을 조인해주고 싶은데 join 구문을 동적으로 처리할 수 있는 좋은 방법이 어떤 것인지 질문드립니다. 😭감사합니다.
- 해결됨실전! Querydsl
순수 jpa 와 queryDsl 실전 관련 오류
아래와 같이 작성했는데 memberJpaRepository. searchWhere() 메서드 호출이 안되네요 ..ㅠㅠ 코드가 문제일까요? @Repository //@RequiredArgsConstructor public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory jpaQueryFactory; // 순수 jpa 와 QueryDsl 적용 전 준비 public MemberJpaRepository(EntityManager em) { this.em = em; this.jpaQueryFactory = new JPAQueryFactory(em); } List<MemberTeamDto> searchByBuilder(MemberSearchCond condition){ // BooleanBuilder 동적쿼리 BooleanBuilder builder = new BooleanBuilder(); //StringUtils.hasTest() import stirng.framework -> null, "" 값에 대한 boolean 값 반환 if(hasText(condition.getUsername())){ builder.and(member.username.eq(condition.getUsername())); } if(hasText(condition.getTeamName())){ builder.and(team.name.eq(condition.getTeamName())); } //age 는 null 값 허용 if (condition.getAgeGoe() != null) { builder.and(member.age.goe(condition.getAgeGoe())); } if(condition.getAgeLoe() != null){ builder.and(member.age.loe(condition.getAgeLoe())); } return jpaQueryFactory .select (Projections.constructor( MemberTeamDto.class, member.id, member.username, member.age, team.id, team.name)) .from(member) .leftJoin(member.team,team) .where(builder) .fetch(); } List<MemberTeamDto> searchByWhere(MemberSearchCond condition){ return jpaQueryFactory .select(Projections.constructor(MemberTeamDto.class, member.id, member.username, member.age, team.id, team.name)) .from(member) .leftJoin(member.team, team) .where( usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeLoe()), ageLoe(condition.getAgeLoe()) ).fetch(); } private BooleanExpression usernameEq(String username){ return StringUtils.hasText(username) ? member.username.eq(username): null; } private BooleanExpression teamNameEq(String teamName){ return StringUtils.hasText(teamName) ? team.name.eq(teamName): null; } private BooleanExpression ageGoe(Integer ageGoe){ return ageGoe!= null ? member.age.goe(ageGoe): null; } private BooleanExpression ageLoe(Integer ageLoe){ return ageLoe != null ? member.age.loe(ageLoe): null; } }
- 미해결실전! Querydsl
안녕하세요. DTO 생성자에 매개변수를 엔티티로 설정하면 문제가 될 수 있나요?
안녕하세요.프로젝션으로 결과를 반환할 때 엔티티를 매개 변수로 받으면 안되는 건지 궁금증이 생겼습니다.@Data @NoArgsConstructor public class MemberDto { private String username; private int age; @QueryProjection public MemberDto(Member member) { this.username = member.getUsername(); this.age = member.getAge(); } }넣어주고자 하는 값이 많을 때 엔티티 자체를 넘겨주면 되지 않나? 라는 생각이 들어 케이스를 구글링해봤는데 모든 예제를 봤을 때 각각의 필요한 값만 매개변수로 설정하는 것으로 보이더라구요.혹시 그 이유가 있는것인지, 이렇게 매개변수를 엔티티로 받게 되면 문제가 될 부분이 있어서 사용을 하지 않는 것인지 궁금합니다.감사합니다!
- 미해결실전! Querydsl
querydsl로깅
[질문 내용]현재 제가 생성한 프로젝트에 builde.gradle파일이구요.jpa를 사용한 쿼리들은 로그에 파라미터가 잘찍히는데요.querydsl을 사용해서 나온 쿼리들은 로그에서 파라미터가 안보여서요. 혹시 해결방법 있을가요?plugins { id 'java' id 'org.springframework.boot' version '3.1.0' 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-web' compileOnly 'org.projectlombok:lombok' 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.9.0' 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" } tasks.named('test') { useJUnitPlatform() }
- 해결됨실전! Querydsl
.join 사용 시 첫 번 째 파라미터 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.해당 두 코드 모두 같은 쿼리를 발생하고 있고 member.team또한 team 클래스를 바라보고 있습니다.둘이 동일한 코드라고 생각이 되었고 제 손은 계속해서 2번 째 코드를 작성하고 있는데 강사님께서 member.team으로 작성하신 이유가 있을거라는 생각이 되어 질문드립니다!혹시 강사님께서 member.team으로 작성하신 이유가 따로 있을까요??
- 미해결실전! Querydsl
EntityManager 관련 오류
em에 빨간줄이 들어와 클릭해보니 주입이 안된다고하는데 무엇이 문제일까요?Could not autowire. No beans of 'EntityManager' type found.
- 해결됨실전! Querydsl
update쿼리로 인한 영속성컨텍스트 불일치
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]수정, 삭제 벌크 연산의 6:20 부분에서 update쿼리로 인한 영속성컨텍스트 문제를 설명해주셨는데요.전 강의에서 em.flush()실행되는 조건들을 설명해주실 때, 직접 호출 시트랜잭션 커밋 시 JPQL쿼리 실행 시 em.flush()가 실행된다고 설명해주신 것으로 기억하고 있습니다.querydsl도 결국 JPQL기반으로 작동된다고 알고 있는데, querydsl을 통한 select쿼리 실행을 하면 자동으로 em.flush()가 실행되지 않고, 직접 해주어야 하는 메커니즘이 궁금합니다!
- 미해결실전! Querydsl
@QueryProjection 관련 오류
강의 대로 Dto 생성자에 @QueryProjection 어노테이션 적용 후 컴파일하여 QMemberDto 클래스 생성 확인이 됐는데 , 테스트 시 위의 그림과 같이 빨간색처리 되며 없다고 뜬다. 무엇이 문제일까요?
- 해결됨실전! Querydsl
계층구조로 join이 일어나는 경우에 대한 질문입니다..
@Table(name = "a") @Entity @Getter public class AEntity { @Id @Column(name = "a_id") private Long aId; @OneToMany(mappedBy = "aEntity") List<BEntity> bList; public void initializeClist() { bList.stream().map(BEntity::getCList).forEach(Hibernate::initialize); } }@Table(name = "b") @Entity @Getter public class BEntity { @Id @Column(name = "b_id") private Long bId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "a_id") private AEntity aEntity; @OneToMany(mappedBy = "bEntity") List<CEntity> cList; }@Table(name = "c") @Entity @Getter public class CEntity { @Id @Column(name = "c_id") private Long cId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "b_id") private BEntity bEntity; }안녕하세요. 수업을 아직 수강중인 학생입니다.위와같이 A -> B -> C 아래로 OneToMany 관계로 LeftJoin을 해야한다고 하면어떤식으로 코드를 짜야하는 걸까요?displayRwdbJpaQueryFactory .selectFrom(QAEntity.aEntity) .leftJoin(QAEntity.aEntity.bList, QBEntity.bEntity) .fetchJoin().fetch();.fetchJoin을 써봤는데.. 한번은 되는데 두번은 안되더라구요..bList.stream().map(BEntity::getCList).forEach(Hibernate::initialize);@BatchSize 주고 위처럼 initialize 해봤는데..테이블 계층구조가 여기서 끝나는게 아니라서.. 이런식으로 처리 되기에는 조금 무리가 있을것 같습니다.장고끝에 조언을 구합니다.. 도와주세요.. ㅠㅠ
- 미해결실전! Querydsl
QueryDsl 의 Qclass 에 대해
Q클래스와 같이 엔티티가 하나씩 더 생기는 데 왜일까요? 괜찮은건가요?? 예 : Hello QHello 이렇게 사진 처럼 생기네요 .
- 미해결실전! Querydsl
내가 쓴 SpringBoot 2.7 에서의 queryDsl 설정 방법.
다른 블로그 참고하여 강의에 맞게 설정을 조금 수정하였습니다.새롭게 강의 듣는 분들의 시간을 아낄 수 있을까 싶어 공유드립니다.장점QEntity 생성 경로가 강의와 같습니다.src/main 하위가 아닌 generated 하위에만 QEntity 가 생성 되어 git ignore설정을 따로 해주지 않아도 됩니다.저도 이 강의의 이 회차를 듣고 알아본 것이기 때문에 QEntity 가 잘 생성되어 Run이 잘되는 것만 확인했지 다른 것까지 모두 테스트 해보진 못했습니다. compileQueryDsl 동작 없이 Application Run 하시면 되겠습니다.아래 설정의 잘못된점이 있다면 댓글 달아주시면 모두에게 도움이 될 것 같습니다.내 블로그 : https://elastinn.tistory.com/11블로그 광고해도 되나 모르겠습니다.감사합니다.plugins { id 'java' id 'org.springframework.boot' version '2.7.12' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' // queryDSL 설정 implementation "com.querydsl:querydsl-jpa" implementation "com.querydsl:querydsl-core" implementation "com.querydsl:querydsl-collections" annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" // java source set 에 querydsl QClass 위치 추가 sourceSets { main.java.srcDirs += [ querydslDir ] } // gradle clean 시에 QClass 디렉토리 삭제 clean { delete file(querydslDir) } //querydsl 추가 끝
- 미해결실전! Querydsl
양방향 연관관계 편의메서드 작성시
QueryDSL 강의 예제 모델에서 , @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public Member(String username, int age, Team team) { this.username = username; this.age = age; if (team != null) { changeTeam(team); } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); 이 부분에서 public void changeTeam(Team team) { this.team.getMembers().remove(this); this.team = team; team.getMembers().add(this);아래와 같이 해당 팀의 멤버 삭제도 해줘야 하는것 아닌가요? public void changeTeam(Team team){ if(this.team != null) { // this.team이 null이 아니면 이 member객체는 team이 있음을 의미 this.team.getMembers().remove(this); // 해당 팀의 멤버에서 삭제 } this.team = team; team.getMembers().add(this); }
- 미해결실전! Querydsl
QueryDsl 2.x 설정시 에러 발생합니다.
1차 시도로 강의자료를 보고 그대로 따라한 후 우측 Gradle Tasks/orther/compileQueryDsl 누르니plugins { id 'java' id 'org.springframework.boot' version '2.7.12' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' //querydsl 추가 implementation 'com.querydsl:querydsl-jpa' 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 { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } //querydsl 추가 끝 아래와 같은 에러가 발생했습니다.Unable to load class 'com.mysema.codegen.model.Type'.This is an unexpected error. Please file a bug containing the idea.log file. 그래서 커뮤니티에 올라온 질문에 대한 답을 보고 따라해봤습니다. plugins { id 'java' id 'org.springframework.boot' version '2.7.12' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } //Querydsl 추가, 자동 생성된 Q클래스 gradle clean으로 제거 clean { delete file('src/main/generated') }노란박스 안에 compileQueryDsl 버튼이 생기지 않습니다. 어떻게 해결해야될까요???
- 미해결실전! Querydsl
동적 쿼리 메서드 조합시 null 처리
@Test public void dynamicQueryWhereParam() { String usernameParam = null; Integer ageParam = 10; List<Member> result = queryFactory .selectFrom(member) // .where(usernameEq(usernameParam), ageEq(ageParam)) .where(allEq(usernameParam, ageParam)) .fetch(); assertThat(result.size()).isEqualTo(1); } private BooleanExpression usernameEq(String usernameParam) { if (usernameParam == null) { return Expressions.TRUE; } return member.username.eq(usernameParam); } private BooleanExpression ageEq(Integer ageParam) { if (ageParam == null) { return Expressions.TRUE; } return member.age.eq(ageParam); } private BooleanExpression allEq(String usernameParam, Integer ageParam) { return usernameEq(usernameParam).and(ageEq(ageParam)); }select m.* from member m where true and m.age = 10;위와 같이 Expressions.TRUE를 반환하게 만들면 쿼리에 true가 포함돼서 실무에서 사용하기에는 좀 그럴까요?
- 해결됨실전! Querydsl
select절 서브쿼리 컬럼으로 where절에 조선으로 넣을 수 있나요??
select절 서브쿼리를 이용해서 where절 에 조건컬럼으로 파라미터를 받을 수 있나요??select(subQuery) as sub,다른 컬럼들from mainQuerywhere sub = :param;위와같은 식으로 서브쿼리 별칭으로 조건검색이 가능한가요?? 가능하면 코드로도 알려주세요감사합니다
- 해결됨실전! Querydsl
DTO에 Entity 포함
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요.public class MemberTeamDto { private Member member; private Team team; @QueryProjection public MemberTeamDto(Member member, Team team) { this.member = member; this.team = team; } }이런식으로 DTO에 엔티티를 직접 포함해도 되나요??실행은 잘되는거 같은데 이렇게 활용해도 되는지 궁금합니다
- 미해결실전! Querydsl
Booleanbuilder이용시 조건 다른 컬럼 조회
private BooleanExpression checkActivityContainsGeneration(Integer generation) { if(generation == null) return null; return QMemberActivity.memberActivity.generaition.eq(generation); }이렇게 전체 멤버를 조회할때, 해당 generation 값을 가져오는 boolean expression을 조회했습니다.하지만, generation 을 이용한 정렬을 할때에는, 해당 userid를 가진 모든 generation 컬럼을 가져와야하는데, 위의 조건처럼 조건을 준다면 해당 generation 컬럼만 가져와서 정렬이 제대로 되지 않더라구요!제가 원하는건 return QMemberActivity.memberActivity.memberId.eq( select memberId from QMemberActivity.memberActivity where QMemberActivity.memberActivity.generation.eq(generation) );과 같이 generation이 같은 컬럼의 memberId를 가져오는 것인데, booleanexpression으로 다른 컬럼 값을 return하려면 subquery를 작성하는 것 뿐일까요?
- 미해결실전! Querydsl
JOIN 2번 질문입니다..! (+is not a root path 에러)
개인 프로젝트중인데 도저히 해결을 못 하겠어서 질문 드립니다..@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Cafe { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cafe_id") private Long id; @NotNull @Column(unique = true) private String name; private String phoneNumber; private String bhours; private String address; private String domain; private String location; @OneToMany(mappedBy = "cafe") private List<Theme> themes = new ArrayList<>(); } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Theme { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "theme_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cafe_id") private Cafe cafe; private String name; private String genre; private String activity; private Integer difficult; private Integer limitTime; private Integer recommendStart; private Integer recommendEnd; @Column(length = 500) private String info; private String imageUrl; @OneToMany(mappedBy = "theme") private List<Review> reviews = new ArrayList<>(); //==연관관계 편의 메서드==// public void changeCafe(Cafe cafe) { this.cafe = cafe; cafe.getThemes().add(this); } } @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @EntityListeners(AuditingEntityListener.class) public class Review { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "review_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "theme_id") private Theme theme; private String nickname; private String password; private LocalDateTime playdate; private Double difficult; private String clear; private String time; private Integer hint; @Column(length = 700) private String content; @CreatedDate private LocalDateTime indate; private Double rating; } Entity는 위와 같고조회하려는 DTO는 다음과 같습니다.public class ThemeListDTO { private Long themeId; private String themeName; private String genre; private Integer recommendStart; private Integer recommendEnd; private String imageUrl; private String cafeName; private String location; private Double ratingAvg; @QueryProjection public ThemeListDTO(Long themeId, String themeName, String genre, Integer recommendStart, Integer recommendEnd, String imageUrl, String cafeName, String location, Double ratingAvg) { this.themeId = themeId; this.themeName = themeName; this.genre = genre; this.recommendStart = recommendStart; this.recommendEnd = recommendEnd; this.imageUrl = imageUrl; this.cafeName = cafeName; this.location = location; this.ratingAvg = ratingAvg; } } theme와 cafe를 join하여 해당 테마의 카페 정보를 가져오고,theme와 review를 join하여 해당 테마에 남겨진 리뷰들의 평균 rating 값을 가져오고 싶습니다.또한 리뷰점수로 desc 하여 테마 리스트를 정렬하고 싶습니다. 이를 위해서public class ThemeRepositoryCustomImpl implements ThemeRepositoryCustom { private final JPAQueryFactory queryFactory; public ThemeRepositoryCustomImpl(JPAQueryFactory queryFactory) { this.queryFactory = queryFactory; } @Override public Page<ThemeListDTO> themeAllListPage(Pageable pageable) { List<ThemeListDTO> themeListContent = queryFactory .select(new QThemeListDTO( theme.id, theme.name, theme.genre, theme.recommendStart, theme.recommendEnd, theme.imageUrl, cafe.name, cafe.location, review.rating.avg() )) .from(theme) .leftJoin(theme.cafe, cafe) .leftJoin(theme, review.theme) .orderBy(review.rating.avg().desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); JPAQuery<Long> countQuery = queryFactory .select(theme.count()) .from(theme); return PageableExecutionUtils.getPage(themeListContent, pageable, countQuery::fetchOne); } } 위와 같이 코드를 작성했습니다. 하지만 이를 실행했을 경우ERROR 8584 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: review.theme is not a root path; nested exception is java.lang.IllegalArgumentException: review.theme is not a root path] with root cause java.lang.IllegalArgumentException: review.theme is not a root path이런 에러 문구가 뜨는데 어떻게 바꾸는 게 맞는 것인가요 ?해당 에러 문구를 구글링해봐도 답을 잘 모르겠어서 질문 드립니다 ..,, 해당 에러 문구가 무슨 뜻인지, 어떻게 해결하면 좋을지join 두번 했을 때 이렇게 하는 게 맞는 것인지리뷰 점수대로 desc 테마 리스트를 정렬하려고 하는데 orderBy에 저렇게 작성하는것이 맞을지에 대하여 답변해주시면 정말 감사하겠습니다 ..
- 미해결실전! Querydsl
MemberJpaRepository와 MemberRepositoryCustomImpl 의 차이
안녕하세요 완강하고 다시 복습중인데MemberJpaRepository와 MemberRepositoryCustomImpl 의 차이가 뭔지 알 수 있을까요 ?MemberJpaRepository에 있는 코드를 MemberRepositoryCustom 및 MemberRepositoryCustomImpl 에 작성하면 안되는건가요 ?따로 나눠져있는 이유가 궁금합니다 .. !