Spring
-
[Spring] querydsl - pagingSpring 2022. 1. 3. 22:45
querydsl 5.0.0버전부터는 fetchResults()와 fetchCount()메소드가 deprecated됬기 때문에 다른방법이 필요하다. Pageable 인터페이스와 PageImpl을 이용하면 비교적 쉽게 페이징할 수 있다. @Override public Page searchPageSimple(MemberSearchCondition condition, Pageable pageable) { List content = jpaQueryFactory .select(new QMemberTeamDto( member.id, member.username, member.age, team.id, team.name)) .from(member) .leftJoin(member.team, team) .where(user..
-
[Spring] @RequestParam 와 @PathVariableSpring 2022. 1. 3. 22:33
controller 단에서 클라이언트에서 url에 파라미터를 같이 전달 하는 경우가 잦다. 그 중 가장 흔한 방법 두가지가 있는데 바로 @ResquestParam 과 @PathVariable이다. @RequestParam ex)/url?param1=2¶m2="***" RequestParam에는 4가지의 파라미터를 갖고 있다. - defaultValue : 값이 없을 때 기본으로 전달할 값 - name : uri에서 바인딩할 파라미터의 이름 - value : uri에서 바인딩하여 별칭으로 정할 값 - required : 필수적으로 값이 전달되어져야 함을 결정하는 값 @GetMapping("getParam") public String viewName( @RequestParam("param1") Str..
-
[Spring] querydsl - 집합Spring 2022. 1. 3. 16:42
집합 함수 @Test public void aggregation() { List result = queryFactory .select( member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min() ) .from(member) .fetch(); Tuple tuple = result.get(0); assertThat(tuple.get(member.count())).isEqualTo(4); assertThat(tuple.get(member.age.sum())).isEqualTo(100); assertThat(tuple.get(member.age.avg())).isEqualTo(25); assertThat(tuple...
-
[Spring] querydsl - 정렬Spring 2022. 1. 3. 01:01
@Test public void sort() { em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.username.asc().nullsLast()) .fetch(); Member member5 = result.get(0); Member member6 = result.get(1); Member memberNull = result.get(2); assertThat..
-
[Spring] querydsl - 결과 조회Spring 2022. 1. 3. 00:56
fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환 fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException fetchFirst() : limit(1).fetchOne() fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount() : count 쿼리로 변경해서 count 수 조회 fetchResults의 경우 토탈카운트 기능을 지원하기 때문에 쿼리를 두번 날린다. 주의 : 복잡한 쿼리나 페이징의 경우 fetchResults를 쓰지 않고 쿼리를 두번 날리는 것을 권장함 출처 : 실전! Querydsl - 인프런 | 학습 페이지 (inflea..
-
[Spring] querydsl - 검색 조건 쿼리Spring 2022. 1. 3. 00:53
검색 조건은 기본적으로 .and 와 .or을 이용해 메소드 체인으로 연결할 수 있다. 그밖에 많은 기능들이 제공된다. member.username.eq("member1") // username = 'member1' member.username.ne("member1") //username != 'member1' member.username.eq("member1").not() // username != 'member1' member.username.isNotNull() //이름이 is not null member.age.in(10, 20) // age in (10,20) member.age.notIn(10, 20) // age not in (10, 20) member.age.between(10,30) //b..
-
[Spring] JPAQueryFactory를 필드로 선언하면 어떻게 될까?Spring 2022. 1. 3. 00:45
JPAQueryFactory를 필드로 제공하면 동시성 문제는 어떻게 될까? 동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager(em)에 달려있다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 된다. 때문에 springconfig 클래스를 만들어 jpaqueryfactory를 autowired해서 쓰면 굉장히 편하다. 출처 : 실전! Querydsl - 인프런 | 학습 페이지 (inflearn.com)
-
[Spring] 새로운 엔티티를 구별하는 방법Spring 2022. 1. 1. 00:00
spring data jpa의 save함수는 구조는 이런식이다. @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } - 새로운 엔티티면 저장(persist) - 새로운 엔티티가 아니면 병합(merge) 그렇다면 새로운 엔티티를 구별하는 기준은 무엇일까? - 식별자가 객체일 때 null로 판단 - 식별자가 자바 기본타입일 때 0으로 판단 - Persistable 인터페이스를 구현해서 판단로직 변경 가능 JPA 식별자 생성 전략이 @GenerateValue 면 save() 호출 시점에 식별..