25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! Querydsl
QueryProjection 수동으로 만들면 어떨까요?
안녕하세요! 초보개발자 명아주입니다. QueryProejction 사용 시, DTO가 QueryDSL 에 의존적인게 단점이라고 하셨습니다. 그 외에는 컴파일 레벨에서 체크할 수 있다는게 정말 큰 장점인 것 같습니다. 그래서 혹시 의존성을 갖지 않으면서 이걸 사용할 방법이 없을까? 라는 의문으로 한가지 테스트를 해보고 찾은 해결 방법은 CustomQUserDto 를 직접 만들어서 쓰면 어떨까 싶습니다. CustomQUserDto는 레포지토리 계층에서만 쓰고, 반환값은 UserDto로 나가니까 서비스에서는 CustomQUserDto를 몰라도 상관이 없을것 같다고 생각했습니다. package study.querydsl.repository.dto;import com.querydsl.core.types.ConstructorExpression;import com.querydsl.core.types.Expression;import com.querydsl.dto.UserDto;public class CustomQUserDto extends ConstructorExpression<UserDto> { public CustomQUserDto(Expression<String> name, Expression<Integer> age) { super(UserDto.class, new Class<?>[]{String.class, int.class}, name, age); //혹은 심플하게 super(UserDto.class, name, age); 라고 해도 됩니다. }} 샘플코드는 자동생성된 QMemberDto를 참고해서 이렇게 짜봤습니다. serialVersionUID는 어떻게 처리해야될지 몰라서 없앴고 없어도 테스트 상에서는 문제없었습니다. @Testpublic void findUserDtoByManualQueryProjection() throws Exception { //given //when List<UserDto> result = query .select(new CustomQUserDto(member.username, member.age)) .from(member) .fetch(); //then for (UserDto userDto : result) { System.out.println("userDto = " + userDto); }} 위처럼 테스트를 진행해봤을때 정상적으로 동작하는걸 확인했는데요. 혹시 이런식으로 QueryProjectionDto를 수동으로 만들어서 사용하시는 경우가 있으신지 궁금합니다. 감사합니다. 명아주 드림 새해 복많이 받으세요~~~~ p.s 한가지 질문드리고 싶은점이 있는데, 강의들으면서 따라 치는 코드를 깃허브에 올리고 있는데 혹시 문제가 된다면 비공개 레포로 변경하려고 합니다. 답변 주시는 대로 원하시는대로 처리하겠습니다!
- 미해결실전! Querydsl
querydsl 작성과 최적화에 문제가 있습니다! 도와주세요!
해당 유저(to_user)가 팔로우한 유저(from_user)가 작성한 모든 게시글(playlist)을 가져오는 쿼리를 작성하고 싶습니다. 정확히 말씀드리자면 작성은 하고 제대로 가져는 오는데 오답같습니다... public List<Playlist> findFolloweesMakePlaylist(Long userSeq){ return jpaQueryFactory .selectFrom(playlist) .join(userLikes).fetchJoin() .on(playlist.user.userSeq.eq(userLikes.toUser.userSeq)) .where(userLikes.fromUser.userSeq.eq(userSeq)) .fetch();} 제가 작성한 코드는 위와 같습니다. 나의 userId인 userSeq를 받아서 게시글 작성자 ID와 내가 좋아요 한 사람ID가 같은 부분을 on절로 join 하고, 플레이리스트 작성한 사람에게 좋아요를 한 사람이 저인지 where절로 체크하였습니다. 테스트 돌리면 답은 나오지만 team member처럼 직접적으로 이어져있지 않으니 join 과정에서 막대한 곱하기 연산이 나올것 같고 애초에 잘못짠것 같습니다... 도와주세요!
- 해결됨실전! Querydsl
countQuery 질문(질문수정)
countQuery는 count할 때, 쿼리 최적화를 위해서 하는 걸로 알고 있는데 public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) { List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto(member.id.as("memberId"), member.username.as("memberName"), member.age, team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where(member.username.eq(condition.getUsername()), team.name.eq(condition.getTeamName()), member.age.goe(condition.getAgeGoe()), member.age.loe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); JPAQuery<Member> countQuery = queryFactory .selectFrom(member) .leftJoin(member.team, team) .where(member.username.eq(condition.getUsername()), team.name.eq(condition.getTeamName()), member.age.goe(condition.getAgeGoe()), member.age.loe(condition.getAgeLoe())); return PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount()); } 어차피 실행될 List<MemberDto> content = queryFactory.select(..생략.. 에다가 long count = content.size(); 하면 count가 나오지만 위처럼 굳이 countQuery를 짜서 쓰는 건 PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount()); 오직 이 기능 때문인가요 ?
- 미해결실전! Querydsl
안녕하세요 영한님!
안녕하세요 영한님! Fecthjoin에 대해서 하나 여쭤보고 싶습니다! 모델 : @Entity@Table(name = "articles")class Article( @field:Id @field:GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long?, @field:ManyToOne(fetch = FetchType.LAZY) @field:JoinColumn(name = "user_id") val user: User,) : BaseTimeEntity() @Entity@Table(name = "users")class User( @field:Id @field:Column(length = 64, name = "user_id") val userId: String, @field:ManyToOne(fetch = FetchType.LAZY) @field:JoinColumn(name = "profile_image_id") var image: Image? = null) : BaseTimeEntity() @Entity@Table(name = "images")class Image( @field:Id @field:GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null,) 목적 : article을 가져올 때 article의 user와 user의 image까지 한 번에 가져오는 것입니다! 처음엔 아래처럼 유저와 이미지를 단순 Join을 했더니 게시글을 찾아올 수 없었는데 그 이유가 무엇일지 여쭤보고 싶습니다. override fun findByIdWithBoardUserAndUserImage(id: Long): Article? { return queryFactory.selectFrom(article) .where(article.id.eq(id)) .join(article.board, board).fetchJoin() .join(article.user, user).fetchJoin() .join(user.image,image).fetchJoin() .fetchOne()} 개인적으로 고민도 해봤는데 join(article.user, user).fetchJoin() 게시글과 유저를 조인할 때 innerJoin을 하게되고 이로인해 join(user.image,image).fetchJoin() 유저와 이미지를 조인할 때 조인할 유저 대상에 문제가 생기는것아닐까?라는 생각이 들었습니다. 그래서 유저와 이미지를 조인할 때 유저를 기준으로 leftJoin하여 유저를 모두 불러오면 해결할 수 있지않을까 생각하여 아래처럼 사용을 했고 게시글을 찾아올 수 있었습니다. override fun findByIdWithBoardUserAndUserImage(id: Long): Article? { return queryFactory.selectFrom(article) .where(article.id.eq(id)) .join(article.board, board).fetchJoin() .join(article.user, user).fetchJoin() .leftJoin(user.image,image).fetchJoin() .fetchOne()} 그렇지만 문제의 원인과 올바른 해결방법?이 무엇일지 정확한 답을 알고 분명하게 알고가고자 질문을 남깁니다!.
- 미해결실전! Querydsl
@Embeddable 관련질문
안녕하세요 질문이 있습니다. 기존 존재하는 컬럼을 변경하면 안되는 DB에 접속해서 사용을 하고 있습니다. team-member 일대다 관계이고 team 정보를 가져올때 member정보를 리스트로 가져오려고 합니다. @Entitypublic class team { @JoinColumn(name = "team_id")private List<member> members; } DTO를 따로 선언해서 가져옵니다. QueryResults<TeamResponse> results = queryFactory .select(new QTeamResponse( team.members )) .from(team) 그런데 에러가 발생하였습니다. nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: not an entity 위의 에러가 떠서 확인을 하였더니 member 클래스가 @Embeddable입니다. 이 문제때문에 위 에러가 발생하는것 같습니다. @Entity로 선언하자니 PK가 있어야한다는데 변경할수는 없고 어떻게 해야 리스트를 가져올수 있을가요? 리스트를 제외했더니 에러없어 잘 가져오는걸 보니 리스트 문제가 맞습니다.
- 미해결실전! Querydsl
특정 필드의 그룹별 최댓값 조회와 where절에 대한 List 사용 방법
안녕하세요. 강의를 들으면서 프로젝트를 진행하고 있다가 막히는 부분이 있어서 질문드립니다. 두서 없는 질문이어서 먼저 죄송합니다. 1. 첫번째는 https://www.inflearn.com/questions/14139 와 비슷한 질문입니다. 지금 하고 있는 프로젝트에서 상품에 대한 테이블은 다음과 같습니다. id price discountPrice shopId 1 10000 9000 1 2 12000 10000 1 3 8000 7500 1 4 10000 9900 2 이때 discountPrice와 price로 할인율을 계산하였는데요. shopId별로 가장 할인율이 높은 것을 1개 뽑고 그 뽑은 것들 중에서 할인율이 높은 순으로 10개를 뽑고 싶습니다. 할인율은 (price-discountPrice)/price * 100 으로 계산하였습니다. queryDSL에서는 from에 대한 서브쿼리를 지원하지 않아 위의 질문처럼 2개 쿼리를 쓰거나 네이티브 쿼리를 쓰려고 하는데요. 이 상황에서 2개 쿼리를 쓴다는게 어떻게 써야하는지 잘 모르겠어서 질문 드립니다. 또 다음 https://helloino.tistory.com/120https://pepperoni.netlify.app/mysql%EC%97%90%EC%84%9C%20%EA%B7%B8%EB%A3%B9%EB%B3%84%20%EC%B5%9C%EC%8B%A0%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0/두 개의 자료를 참조하여 다음과 같이 만들었습니다. 할인율을 직접 보려고 rate라는 걸 추가했는데 0으로 나오네요... 왜 안되는지도 궁금합니다 QProduct p1 = new QProduct("p1");QProduct p2 = new QProduct("p2");return queryFactory.select(Projections.fields(ProductTmp.class, shop.id.as("shopId"), shop.name.as("shopName"), p1.id, p1.name, p1.price, p1.discountedPrice, p1.price.subtract(p1.discountedPrice).divide(p1.price).multiply(100L).as("rate"), p1.image)) .from(p1) .innerJoin(p1.shop, shop) .leftJoin(p2) .on(p1.shop.id.eq(p2.shop.id) .and(p1.price.subtract(p1.discountedPrice).mod(p1.price).multiply(100L) .lt(p2.price.subtract(p2.discountedPrice).mod(p2.price).multiply(100L)))) .where(p2.id.isNull()) .orderBy(p1.price.subtract(p1.discountedPrice).mod(p1.price).multiply(100L).desc()) .limit(10) .fetch(); 2. 하고 있는 프로젝트에서 Shop 이란 Entity 안에는 List<String>category가 있습니다. 그런데 DB로 들어갈때는 해당 List의 요소들을 꺼내서 ,(콤마)로 이어서 하나의 String으로 만들어 DB에 넣어주고 DB에서 꺼낼때는 ,(콤마) 기준으로 나누어서 List<String>으로 꺼내줍니다. 이때 저는 입력으로 들어오는 String category가 shop의 category 안에 있는지 판단하고 이것을 where 절에 넣고 싶어서 다음을 구현했습니다. public BooleanExpression eqCategory(String category) { return hasText(category) ? shop.category.contains(category) : null;}.where(eqCategory(category)) 그런데 해당 에러가 뜨면서 되지 않습니다. java.lang.NullPointerException: Cannot invoke "org.hibernate.persister.collection.QueryableCollection.getElementPersister()" because "queryableCollection" is null shop.category.getType()은 interface java.util.List가 나오고 shop.category.getClass()는 class com.querydsl.core.types.dsl.ListPath가 나왔습니다. queryDSL에서는 List안에 있는지 판단하는게 지원이 안되는지 궁굼하고 이런 경우에는 어떻게 해결해야 하는지 궁금합니다.
- 미해결실전! Querydsl
persist 에 unknown Entity Hello 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, Hello hello = new Hello();em.persist(hello); 여기서 persist 에 unknown Entity Hello 하고 에러가 뜨는데요 최신 버전의 스프링부트를 다운받아 그레들 버전도 7이라서 버전의 문제인가 검색을 통해 해결하려고 했지만 잘안되어서 질문을 남기게 되었습니다. 구글드라이브에 파일을 업로드하였는데 한 번 봐주셨으면 합니다. https://drive.google.com/file/d/1JN665qqgZ2DqhBJW5XIWCyiXcBWp0Yze/view?usp=sharing
- 미해결실전! Querydsl
concat() stringValue 나이를 완전히 가져오지 못합니다.ㅠㅠ
안녕하세요 질문이 있습니다 concat을 사용해서 stringValue를 활용할 때 나이를 다 가져오지 못하고 맨 앞에 있는 숫자만 가져오는데 왜 그럴까요ㅠㅠㅠㅠ
- 미해결실전! Querydsl
서브쿼리와 dto에 대해서 물어볼게 있습니다.
안녕하세요 제가 querydsl로 프로젝트를 하는 중인데 queryFactory .select(new QDto(user.id, JPAExpressions. 서브쿼리문) ) 이렇게 Dto 안에 서브쿼리문이 들어갈 수 있나요? 아무리 작업을 해도 안되서 물어봅니다ㅠㅠ
- 미해결실전! Querydsl
단축키 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]영한님 강의하시다 보면 intellij 상에서 함수를 선택한 후에 단축키를 누르면, 리턴 타입과 리턴 변수가 자동 생성되던데, 해당 단축키좀 알수 있을까요?
- 미해결실전! Querydsl
영속성 컨텍스트에 대해 질문드립니다.
jpaQueryFactory .selectFrom(member) .fetch();jpaQueryFactory .selectFrom(member) .fetch();이런식으로 테스트 코드를 짠 후 실행시켰는데select문이 2번 나갔습니다.제가 이해한 바로는 select문이 한번 나가고 2번째 쿼리에 대해서는 영속성 컨텍스트 1차 캐시에서 가져와서select문이 안나가야 하는데2번 나간게 이해가 되질 않습니다..
- 미해결실전! Querydsl
queryDsl 페치 조인 질문드립니다.
Member findMember = jpaQueryFactory .selectFrom(QMember.member) .join(member.team, team).fetchJoin()//뒤에 fetchJoin만 붙여주면 된다. .where(QMember.member.username.eq("member1")) .fetchOne(); jpaQueryFactory .select(QMember.member, team) .from(member) .join(member.team, team) .where(QMember.member.username.eq("member1")) .fetchOne();첫번째건 fetchjoin을 사용한 것이고두번째건 select(member, team) 하고 join 한 것인데jqpl은 다르게 나가더라도 결국 sql 은 같게 나옵니다.차이가 없는건가요?
- 미해결실전! Querydsl
안녕하세요 마지막 applyPagination 구현시 stackOverFlow 에러 질문 드려요..
@GetMapping("/v5/members")public Page<Member> searchMemberV5ByCustomSupport(MemberSearchCondition condition, Pageable pageable) { return memberTestRepositoryBySupport.applyPagination(condition, pageable);} 다름 아니라 테스트 겸 해당 컨트롤러를 만들어서 호출해보니 스택오버 플로우 발생되어 질문 올려요. Member 엔티티쪽에는 Lazy 설정 해놨구, // return applyPagination(pageable, query -> query// .selectFrom(member)// .leftJoin(member.team, team)// .where(// usernameEq(condition.getUsername()),// teamNameEq(condition.getTeamName()),// ageGoe(condition.getAgeGoe()),// ageLoe(condition.getAgeLoe())// )// ); return applyPagination(pageable, query -> query .selectFrom(member) .leftJoin(member.team, team) .fetchJoin() .distinct() .where( usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe()) ) ); } 주석부분은 영한님이 적으신 거고 아래쪽은 제가 해결해 보려 적은 코드 부분입니다. 질문은 2가지로써.. 1.결과적으로 JsonIgnore 적용하면 값은 제대로 나오는데 JsonIgnore 말고는 방법이 없을까요?? 2.영한님이 제공해 주신 dsl4Repository 애서 PageableExcutionUtils 는 더이상 지원이 안되는 것 처럼 줄이 그어져 있는데 다른 방법이 있을까요? 읽어 주셔서 감사합니다. 강의는 정말 돈이 전혀 아깝지 않을 정도로 훌륭하더군요!!:) 추가 : return applyPagination(pageable, query -> query .select(new QMemberTeamDto( 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.getAgeGoe()), ageLoe(condition.getAgeLoe()) )); 해당 return 타입을 dto로 변경하고 JsonIgnore 삭제하면 페이지는 잘 나옵니다.. entity 로 가져와서 dto를 반환하는게 나을까요..바로 dto로 조회하는게 나을런지요.. 제 생각에는 dto로 변환하는게 로직을 한번 이라도 덜 태워서 나을것 같긴한데..고견을...말씀해 주시면 감사하겠습니다ㅜㅜ 혹 Entity로 가져와서 dto 로 변환해야 한다면, 알려주신 방법처럼 Stream() 을 이용한 map()형식의 리스트로 변환하는게 좋을까요??성능에 문제가 없을지 궁금하기도한데.. 질문이 많쵸..부족함이 많아서 그런거 같습니다.. 감사합니다!
- 미해결실전! Querydsl
영한님..안녕하세요..page total count 질문있어요 ㅠㅠ
영한님 안녕하세요 강의 정말 좋아요!! 다름아니라 질문이 있어서 남겨봐요... totalCount를 구하려할때 SearchSimple 같은경우 content를 가져와서 fetch()를 쓰는데용..(fetchResults)가 사용이 안되어서요.. content 로 값을 가져와서 content.size()를 하면 토탈 카운트가 안뽑히던데..혹시 total count 를 뽑느 예시가 있을까요?? 새벽이라 너무 졸려서 질문이 이상한 점 죄송해요 혹시 질문이 이해가 잘 안되시면 답변주시면, 제가 다시 올려보겠습니다 ㅠㅠ.. 코드를 복사하려해도 지금 다른 컴퓨터 2대로 보고있어서 힘들어서요 ㅠㅠ.. 감사합니다
- 미해결실전! Querydsl
안녕하세요 프로젝션 결과반환을 dto로 하는데 있어 질문을 드립니다
안녕하세요 현재 jpa 모든 강의를 듣고 토이프로젝트를 진행하고 있습니다 질문의 요지는 querydsl을 통해 dto로 조회할때 XXXtoMany 관계의 컬렉션을 함께 조회하고 싶어요 현재 제 상황은 이렇습니다 일기장에 일기를 쓰는데 질문을 통해 일기를 쓰는방식이라 일기장에 사용된 질문이 필요해요 Diary라는 엔티티가 있고 Question이라는 엔티티가 있는데 이 두 엔티티의 관계가 다대다 관계여서 가운데 DiaryItem이라는 엔티티를 두고 다이어리 페이지에 필요한 모든 정보를 한번에 조회하는것이 목적입니다 이런 방식으로 Diary엔티티를 조회할때와 마찬가지로 엔티티에 의존적이지 않게 dto로 받으면서 무한루프에 빠지지 않도록 필요한 정보만 받을 수 있도록 조회를 하는 방법이 궁금해 질문드립니다 같은 방식으로 DiaryDto가 아니라 Diary에 담은뒤 Controller에서 DiaryDto의 생성자를 통해 변환을 하면 정상적으로 값이 담겨 오는데 queryFactory의 fetch를 통해 직접 DiaryDto에 담으면 에러가 발생합니다ㅠㅠ 현재 이방식으로 쿼리를 실행해보면 query specified join fetching, but the owner of the fetched association was not present in the select list 라는 에러가 나옵니다... 어떤에러인지도 궁금하구요ㅠㅠ 도움부탁드립니다ㅎㅎ
- 미해결실전! Querydsl
querydsl 쿼리 테스트 작성이 궁금합니다.
과 같이 구성했을 때 queryDSL 의 쿼리의 테스트코드를 작성할 때 springboottest 로 올려야할까요? memberRepository 는 interface니까 순수 JUnit 테스트로 하려니 객체를 생성할 수가 없어서 스프링부트테스트로 올려서 빈으로 받아오는 방법말곤 잘 모르겠습니다. (찾다보니 querydsl 자체를 jpaqueryfactory 를 mocking 해서 테스트하는게 있긴하던데 쿼리가 동작하는지 확인하는데 모킹으로 테스트하는 건 기능이 잘 작동하는지 보장하지 않는다고 생각합니다) 혹시 queryDSL 의 테스트를 작성해야 한다면 어떻게 해야할까요?
- 미해결실전! Querydsl
페치조인 질문입니다.
안녕하세요 개인프로젝트를 하다가 궁금한게 생겨서 질문드립니다! 궁금한 것은 페치조인시 조인할 엔티티의 전부가 아닌 일부분만 조인할 수 있나? 입니다. 일반적으로 페치조인을 사용하면 팀(영상기준) 엔티티의 전부가 조인되는데 만약 팀 엔티티의 name만 사용하고 싶을때 그부분만 패치조인을 사용할 수 있을까요? java QueryResults<Recipe> recipeQueryResults = queryFactory .selectFrom(recipe) .join(recipe.member, member).fetchJoin() .offset(page*10) .limit(pageable.getPageSize()) .fetchResults(); Hibernate Hibernate: select recipe0_.recipe_id as recipe_i1_2_0_, member1_.member_id as member_i1_1_1_, recipe0_.created_date as created_2_2_0_, recipe0_.modified_date as modified3_2_0_, recipe0_.content as content4_2_0_, recipe0_.member_id as member_i6_2_0_, recipe0_.title as title5_2_0_, member1_.created_date as created_2_1_1_, member1_.modified_date as modified3_1_1_, member1_.email as email4_1_1_, member1_.name as name5_1_1_, member1_.password as password6_1_1_, member1_.role as role7_1_1_, member1_.user_id as user_id8_1_1_ from recipe recipe0_ inner join member member1_ on recipe0_.member_id=member1_.member_id 혹시나 제 설명이 이상할까봐 덧붙입니다.. 예를 들어서 위 코드에서는 member의 전부를 페치조인하지만 만약 member의 name만 페치조인 할 수 있는지에 대한 질문입니다.
- 미해결실전! Querydsl
fetchresults, fetchcount 공식적 deprecated
안녕하세요. 강의 잘 듣고 있습니다. querydsl 개발진 측에서 fetchCount와 groupby를 함께 사용할 때 생기는 문제로 인해 fetchcount 함수를 deprecated 시켰습니다.그런데 영한님 강의 중 querySupportReposity 사용자 정의 구현 클래스에서도 이 deprecated된 메서드를 사용하고 있습니다. 그래서 그것의 대안으로 fetch().size()를 제안하고 있는데, 그래서 제 나름대로 fetchCount 부분을 아래처럼 변경했습니다. protected <T> Page<T> applyPagination(Pageable pageable, Function<JPAQueryFactory, JPAQuery> contentQuery) { JPAQuery jpaQuery = contentQuery.apply(getQueryFactory()); List<T> content = getQuerydsl().applyPagination(pageable, jpaQuery).fetch(); return PageableExecutionUtils.getPage(content, pageable, () -> Long.valueOf(jpaQuery.fetch().size()));}protected <T> Page<T> applyPagination(Pageable pageable, Function<JPAQueryFactory, JPAQuery> contentQuery, Function<JPAQueryFactory, JPAQuery> countQuery) { JPAQuery jpaContentQuery = contentQuery.apply(getQueryFactory()); List<T> content = getQuerydsl().applyPagination(pageable, jpaContentQuery).fetch(); JPAQuery countResult = countQuery.apply(getQueryFactory()); return PageableExecutionUtils.getPage(content, pageable, () -> Long.valueOf(countResult.fetch().size()));} 그러나 이것은 List의 size를 추출하는 거라서 int를 반환하게 되는데, 만약 조회개수가 int 범위를 넘어가게 되면 오버플로우 문제가 발생할텐데 다른 해결 방법이 있을까요?제 생각엔 아래의 2가지 방법만 있다고 생각하는데, querydsl을 그대로 사용하면서 다른 방법이 있을까요?1.스프링데이터JPA 구현 repository를 만들어 순수 JPA 쿼리로 사용하기 public long totalCount(int age) { return em.createQuery("select count(m) from Member m where m.age = :age", Long.class) .setParameter("age", age) .getSingleResult();} 2. native query 사용하기
- 미해결실전! Querydsl
QueryDSL collection 다루기 질문있습니다.
List<String> permissionList = Arrays.asList("CONTENT_READ", "CONTENT_WRITE"); User --- UserPermission --- Permissions로 각각 one to many ,many to one 으로 이루어져있는데 퍼미션들을 하나라도 가지고 있는 유저를 뽑을 땐 qf.selectFrom(user).innerJoin(user.userPermissions, permission).on(user.permissions.`in`(permissionList)) 이렇게 할 수 있는 것 같은데 다 가지고 있는 유저를 선택할 땐 어떻게 해야할까요?
- 미해결실전! Querydsl
from 절의 subquery와 view 테이블 관련
안녕하세요, 김영한님 강의 잘 듣고있습니다! 혹시 from 절에 subquery를 사용하게 되는 경우 JPA에서는 한계가 있다면 View 테이블을 만들어 놓고 Entity class를 생성하여 사용하는건 실무에서 문제가 있을까요? (유지보수 관점에서요!) select * from (select ~~~ from ~~) ~~ 이거를 create view XXX as select ~~~ from ~~ view 를 만들어놓고 select * from XXX; 요렇게요 답변 미리 감사합니다 :)