25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
SQL Function 관련 (DB : postgresql)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] DB는 Postgresql 사용 중으로, .yml 에 아래와 같이 정의했습니다. dialect: org.hibernate.dialect.PostgreSQL10Dialect 사용하고 싶은 것은 날짜별로 Group By 하여 AVG 구하는 것인데요. 아래와 같이 sql 문 작성하였는데 에러가 납니다ㅜㅜ return queryFactory.select(Expressions.dateTimeTemplate(LocalDateTime.class, "DATE_FORMAT({0}, '{1s}')", osMonitorCollection.timestamp, ConstantImpl.create("YYYY-MM-DD")), osMonitorCollection.cpuUtilization.avg()) .from(osMonitorCollection) .groupBy(Expressions.dateTimeTemplate(LocalDateTime.class, "DATE_FORMAT({0}, '{1s}')", osMonitorCollection.timestamp, ConstantImpl.create("YYYY-MM-DD"))) .fetch(); org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode +-[METHOD_CALL] MethodNode: '(' | +-[METHOD_NAME] IdentNode: 'DATE_FORMAT' {originalText=DATE_FORMAT} | \-[EXPR_LIST] SqlNode: 'exprList' | +-[DOT] DotNode: 'osmonitorc0_.timestamp' {propertyName=timestamp,dereferenceType=PRIMITIVE,getPropertyPath=timestamp,path=osMonitorCollection.timestamp,tableAlias=osmonitorc0_,className=com.kt.cloud.redis.monitoring.domain.OsMonitorCollection,classAlias=osMonitorCollection} | | +-[ALIAS_REF] IdentNode: 'osmonitorc0_.os_monitor_collection_id' {alias=osMonitorCollection, className=com.kt.cloud.redis.monitoring.domain.OsMonitorCollection, tableAlias=osmonitorc0_} | | \-[IDENT] IdentNode: 'timestamp' {originalText=timestamp} | \-[QUOTED_STRING] LiteralNode: ''YYYY-MM-DD''
- 미해결실전! Querydsl
compileQuerydsl 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의를 처음 듣고 있는 학생입니다 강의 영상에서와 같이 프로젝트를 만든후 compileQueryDsl을 실행하니 Unable to load class 'com.mysema.codegen.model.Type'. 이 에러가 나오면서 컴파일이 되지 않습니다 도저히 답을 찾을 수가 없어서 질문남겨요
- 해결됨실전! Querydsl
Predicate 타입에 관한 질문
predicate Predicate teamNameEq(String teamName) { return hasText(teamName) ? team.name.eq(teamName) : null; } 에서 질문입니다. return타입은 BooleanExpression타입인데 Predicate타입에 받아도 컴파일이 안뜨는 것 같아서 Predicate는 Boolean을 return으로 받는 걸로 알고 있는데 BooleanExpression도 return으로 받나요 ?
- 미해결실전! Querydsl
Slice 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. slice 관련된 질문 이있습니다. slice querydsl에 slice를 사용할 때 id값으로 List<Long> ids = queryFactory.select(entity.id).distinct() .from(entity) .innerJoin(menu).on(menu.store.id.eq(entity.id)) .where( entity.id.lt(cursorId) ) .orderBy(entity.id.desc()) .limit(size) .fetch(); 이렇게 id 값으로 less than 을 사용해서 중복을 제거 하는데, 만약 title 과 같이 order by 가 다양하게 들어가게 되면 중복이 가능한 title로 인해서 pagination 에서 중복 데이터가 불러와 진다고 생각 이듭니다. 이런경우 에는 어떤 식으로 구현 하면 되나요? List<Long> ids = queryFactory.select(entity.id).distinct() .from(entity) .innerJoin(menu).on(menu.store.id.eq(entity.id)) .where( entity.id.lt(eneityData.getTitle()) ) .orderBy(entity.title.desc()) .limit(size) .fetch();
- 해결됨실전! Querydsl
벌크연산 실행순서 질문(확인 질문)
벌크연산 후 em.flush(); em.clear();를 하라는 얘기를 듣다가 갑자기 동작순서에 대해 생각해보게 됐습니다. em.findOne(Long id)로 id = 1, name = "member1"이라는 데이터를 조회하고 "member1"이라는 name을 "회원"로 수정 후, id = 1인 데이터의 name을 "비회원"으로 벌크연산으로 하면(하나만 수정한다고 억지성 가정) Querydsl은 JPQL로 이루어져있으니까 JPQL은 실행 전에 자동으로 em.flush()를 실행하게 되어있으니 벌크연산(Querydsl)이 실행이 되는 순간, em.flush()가 되어 "회원"으로 먼저 수정이 되고 벌크연산 쿼리로 "비회원"으로 바꿔지는 거 맞나요? 맞는 것 같긴 한데 주변에 확인차 물어볼 사람이 없어서 질문드립니다 :[
- 미해결실전! Querydsl
check dirty entity
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예 [질문 내용]기억이 잘 못 된 것일 수 있습니다. 분명 강의 중에 dirty entity를 확인하는 방법이 Util 혹은 Factory 클래스로 확인 했던 것 같은데 찾을 수가 없어서 문의드립니다.
- 미해결실전! Querydsl
querydsl 쿼리문 관련하여 질문 드립니다.
안녕하세요, 항상 강의 잘 듣고 있습니다. querydsl을 이용하여 view를 활용하여 select할 수 있는 방법이 있을까요?
- 해결됨실전! Querydsl
java: variable em might not have been initialized 오류
@SpringBootTest@Transactionalpublic class QuerydslTest { @Autowired MemberRepository memberRepository; @Test public void dynamic_BooleanBuilder() { String username = null; int age = 10; List<Member> members = memberRepository.searchMemberAll(username, age); for (Member member : members) { System.out.println("member = " + member); } }} MemberRepository를 만들어서 동적쿼리를 테스트하려고 했는데 C:\study\querydsl\querydsl\src\main\java\study\querydsl\repository\MemberRepository.java:21:56 java: variable em might not have been initialized오류가 떴습니다. @Repository@RequiredArgsConstructorpublic class MemberRepository { private final EntityManager em; JPAQueryFactory queryFactory = new JPAQueryFactory(em); public List<Member> searchMemberAll(String username, Integer age) { BooleanBuilder booleanBuilder = new BooleanBuilder(); if (username != null) { booleanBuilder.and(member.username.eq(username)); } if (age != null) { booleanBuilder.and(member.age.eq(age)); } return queryFactory.selectFrom(member).where(booleanBuilder).fetch(); }} 어디가 문제일까요 ? @RequiredArgsConstructor로 em을 초기화했다고 생각하는데.. ;;
- 미해결실전! Querydsl
querydsl 쿼리문 관련질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용]안녕하세요! Querydsl관련해서 여쭤보고싶은게 있는데요 select절에서 count 합수사용시 select절에는 집계함수만 입력가능한가요? ex) select절에 이런식으로도 작성이 가능한가요? .select(new QResponse(aEntity, bEntity.count() , cEntity.count()))
- 미해결실전! Querydsl
get()의 사용에 대한 질문
안녕하세요. Member findMember = memberJpaRepository.findById(member.getId()).get(); 에서, 테스트 할때, get()을 사용하면 안 된다고 강의에서 설명을 하셨는데요. 혹시 올바른 사용에 대해 참조할 문서 링크를 소개해 주실 수 있으신지요? 읽어주셔서 감사합니다.
- 미해결실전! Querydsl
벌크 연산에 대한 질문
안녕하세요. <수정, 삭제 벌크 연산> 강의에서 다음 코드에 대한 질문이 있습니다. @Test public void bulkUpdate() { long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); em.flush(); em.clear(); List<Member> result = queryFactory .selectFrom(member) .fetch(); for (Member member1 : result) { System.out.println("member1 = " + member1); } } em.flush();를 하는 순간 영속성 컨텍스트에 있던 정보가 DB에 반영되게 되는데, 이렇게 되면 update(member)에서 수정한 DB 정보와 충돌이 발생되지 않나요? 따라서 member.username이 "비회원"으로 수정되지 못 하는 것 아닌지요? 읽어주셔서 감사드립니다.
- 미해결실전! Querydsl
AttributeConverter로 적용하는 필드에 대해 그룹함수 적용은 어떤 방식으로 해야할까요?
안녕하십니까 집합 함수 적용에 관해 궁금한 점이 있어서 질문 드립니다. 아래와 같이 AttributeConverter 적용 필드의 경우에는 QueryDSL로 집합함수 적용이 가능한 방법이 있는지 궁금합니다. public class Product { public enum ProductStatus { PROCEEDING, SOLD_OUT;} @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "PRODUCT_ID") private Long id; @Column(name = "TITLE") private String title; @Column(name = "PRICE") private Money price; } public class Money { public static final Money ZERO = Money.wons(0); private final BigDecimal amount; public static Money wons(long amount) { return new Money(BigDecimal.valueOf(amount)); } public static Money wons(double amount) { return new Money(BigDecimal.valueOf(amount)); } public static <T> Money sum(Collection<T> bags, Function<T, Money> monetary) { return bags.stream().map(bag -> monetary.apply(bag)).reduce(Money.ZERO, Money::plus); } Money(BigDecimal amount) { this.amount = amount; } public Money plus(Money amount) { return new Money(this.amount.add(amount.amount)); } public Money minus(Money amount) { return new Money(this.amount.subtract(amount.amount)); } public Money times(double percent) { return new Money(this.amount.multiply(BigDecimal.valueOf(percent))); } public Money divide(double divisor) { return new Money(amount.divide(BigDecimal.valueOf(divisor))); } public boolean isLessThan(Money other) { return amount.compareTo(other.amount) < 0; } public boolean isGreaterThan(Money other) { return amount.compareTo(other.amount) > 0; } public BigDecimal getAmount() { return amount; } public Long longValue() { return amount.longValue(); } public Double doubleValue() { return amount.doubleValue(); } public boolean equals(Object object) { if (this == object) { return true; } if (!(object instanceof Money)) { return false; } Money other = (Money)object; return Objects.equals(amount.doubleValue(), other.amount.doubleValue()); } public int hashCode() { return Objects.hashCode(amount); } public String toString() { return amount.toString() + "원"; } } @Converter(autoApply = true) public class MoneyConverter implements AttributeConverter<Money, Long> { @Override public Long convertToDatabaseColumn(Money money) { return money.getAmount().longValue(); } @Override public Money convertToEntityAttribute(Long amount) { return Money.wons(amount); } }
- 해결됨실전! Querydsl
Member에서 타고 들어가는 생성자에 관한 질문
@Entity@Getter @Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of = {"id", "username", "age"})public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; public Member(String username) { this(username, 0); } public Member(String username, int age) { this(username, age, null); } public Member(String username, int age, Team team) { this.username = username; this.age = age; if (team != null) { changeTeam(team); } } 에서 public Member(String username) { this(username, 0); } 을 보면, public Member(String username) { this(username, 0, null); } 이 아니라 public Member(String username) { this(username, 0); } 을 사용한 이유는 가독성 때문인가요 ?
- 해결됨실전! Querydsl
QHello qHello = new QHello(
좀 쓸데없는 곳에 꽂혀있는 거일 수도 있는데 new QHello("h")에서 "h"는 무슨 역할을 하나요 ? 조금 찾아보니까 static을 사용해서 QHello.hello하면 new QHello("Hello") 라고 하던데 문자로 엔티티를 찾는 용도였으면 강의에서 "h"로 넣기도 했으니까 아닌 것 같고.. intelliJ로 함수를 쫓아쫓아가보니까 한도 끝도 없어서.. 초보인 저에게는 잘 모르겠더라구요 new QHello("h")에서 "h"의 용도가 무엇일까요 ?
- 미해결실전! Querydsl
Impl 네이밍 규칙 질문
안녕하세요, 질문이 있어서 글을 남깁니다! MemberRepositoryImpl 이라는 클래스명에 정해진 규칙이 있는건 조금 알겠지만, 제 코드 상에서는 MemberRepositoryCustom의 구현체명, 즉 강의에는 MemberRepositoryImpl 로 되어있는 클래스를 MemberRepositoryCustomImpl로 변경해도 정상 동작하더라구요! 혹시 원인을 알 수 있을까요?? 감사합니다 :)
- 해결됨실전! Querydsl
내부조인 on 사용
안녕하세요 영한님 저는 jpa 야생형 로드맵을 수강한 후 토이프로젝트를 진행하고 있는 도중 여쭈어보고 싶은게 생겨서 글을 올리게 되었습니다. 먼저 해당 강의를 통하여 내부조인을 사용하면, where 절에서 필터링 하는 것과 기능이 동일하기 때문에 where절의 의도와 맞게 내부조인에서는 on절이 아닌 where절을 사용하는게 좋다고 이해하였습니다. 아래 사진은 파라미터가 Item의 name에 포함된 경우 해당 Item의 관련된 여러 테이블을 join하여 Shop을 조회하고 싶어서 작성하게 된 코드와 실행했을 때 나타난 쿼리입니다. 처음에는 findByNameContainsV1 메소드를 작성하였지만 Item부터 Shop 사이에 있는 모든 테이블을 조인한 후 where절에서 Item의 name과 같은 Shop을 조회하기 때문에 조금 더 쿼리를 최적화 시킬 수 있다고 생각했습니다. 그래서 findByNameContainsV2 메소드를 작성하게 되었는데요. sql 문법상 join이 where보다 먼저 실행된다고 알고 있었기 때문에 where 대신 on절을 넣어주었습니다. 하지만 테스트를 통하여 on절에도 동적쿼리를 사용할 수 있는지 확인해 보았지만 불가능했습니다. 아직 개발에 대한 지식이 많이 부족해서 성능 최적화에 대해 잘 모르지만 저는 findByNameContainsV2 메소드가 findByNameContainsV1메소드보다 더 성능이 잘 나온다고 생각이 되지만 QueryDSL은 JPA에서 동적 쿼리를 사용하기 위해 실무에서 도입하게 된 것이므로 굳이 고민하지 않아도 되는 것인지, 아니면 실무에서 동적쿼리가 아닌 경우에 findByNameContainsV2 메소드와 같이 코드를 작성해도 되는지 영한님의 의견을 여쭈어 보고 싶습니다.
- 미해결실전! Querydsl
StringPath to NumberPath
안녕하세요. 강의 재밌게 보고있습니다. db 설계를 잘못해서 student 테이블의 department_id는 varchar(11) department 테이블의 id는 int(11) 로 설계한 상태에서 queryDSL로 where 조건을 student.department_id = department.id 이렇게 주고싶은데 student.department_id = StringPath department.id = NumberPath 로 둘 형식이 달라서 비교가 안 됩니다. DB 설계를 바꾸지 못하는 상황에서 저 두개를 어떻게 비교할 수 있을까요?? StringPath에 보니까 castToNum이 있던데 이걸 사용하면 될까요??
- 미해결실전! Querydsl
leftjoin을 사용한 이유
public List<MemberTeamDto> search(MemberSearchCondition condition) { return queryFactory .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()) ) .fetch(); } 이때 leftJoin(member.team, team)을 사용하신 특별한 이유가 있나요? join을 사용하면 안되는 건지 궁금합니다!
- 미해결실전! Querydsl
selectSubQuery()에서 결과값에 접근하는 방법!
Querydsl 강의를 듣던 도중, 16강(서브 쿼리)에서 마지막 코드에 대한 질문입니다. 저는 강의를 Kotlin으로 학습하고 있는데요, result의 타입이 `List<Tuple>` 이고, 이 리스트에 있는 각 `Tuple`들에 접근해서 age를 꺼내오고 싶습니다. `for (tuple in result)`로 하나의 `Tuple`을 순회하며 `println(tuple)`을 해보면, 강의 내용과 동일하게 나오지만, `println(tuple.get(member.age))` 또는 `println(tuple.get(member.age.avg()))`는 null 이라고 출력됩니다.. `println(tuple.get(member.username))`은 잘 나오는데, age만 null이라고 출력되어 이 age에 어떻게 접근할 수 있을지 궁금해서 질문 남깁니다!!
- 해결됨실전! Querydsl
@Autowired vs @PersistenceContext
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] MemberTest 코드에서 EntityManager를 @PersistenceContext 를 통해 주입받으셨는데 @Autowired 로 주입을 받아도 정상적으로 작동하더라고요. 찾아보니 @PersistenceContext 를 통해 EntityManagerFactory에서 주입받기 위해서다, 여러 요청에 대하여 동일한 EntityManager를 반환하기 위해서이다. 라는 말을 들었는데 위의 이유들 때문인가요? @Autowired vs @PersistenceContext 의 차이를 알고싶습니다.