spring data jpa : Specifications

This commit is contained in:
haerong22
2021-09-03 21:39:24 +09:00
parent 2ba3743d86
commit 79e507f8bd
3 changed files with 55 additions and 1 deletions

View File

@@ -14,7 +14,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Optional;
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom{
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom, JpaSpecificationExecutor<Member>{
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

View File

@@ -0,0 +1,33 @@
package com.example.springdatajpa.repository;
import com.example.springdatajpa.entity.Member;
import com.example.springdatajpa.entity.Team;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.ObjectUtils;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
public class MemberSpec {
public static Specification<Member> teamName(final String teamName) {
return (root, query, criteriaBuilder) -> {
if (ObjectUtils.isEmpty(teamName)) {
return null;
}
Join<Member, Team> t = root.join("team", JoinType.INNER);// 회원과 조인
return criteriaBuilder.equal(t.get("name"), teamName);
};
}
public static Specification<Member> username(final String username) {
return (root, query, criteriaBuilder) -> {
if (ObjectUtils.isEmpty(username)) {
return null;
}
return criteriaBuilder.equal(root.get("name"), username);
};
}
}

View File

@@ -11,6 +11,7 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
@@ -310,7 +311,27 @@ public class MemberRepositoryTest {
@Test
void callCustom() {
List<Member> result = memberRepository.findMemberCustom();
}
@Test
void specBasic() {
// given
Team teamA = new Team("teamA");
em.persist(teamA);
Member member1 = new Member("member1", 0, teamA);
Member member2 = new Member("member2", 0, teamA);
em.persist(member1);
em.persist(member2);
em.flush();
em.clear();
// when
Specification<Member> spec = MemberSpec.username("member1").and(MemberSpec.teamName("teamA"));
List<Member> result = memberRepository.findAll(spec);
assertEquals(1, result.size());
}
}