나머지 기능들은 사실 실무에서 잘 사용하지 않는다.
약간은 편하게 듣자. 실무에서 쓰기 애매한 기능들이다.
강하게 얘기하면 실무에서 쓰지마라 ㅎㅎㅎ
JpaSpecificationExecutor
를 엔티티에서 상속public class MemberSpec {
public static Specification<Member> teamMember(final String teamName) {
return (Specification<Member>) (root, query, criteriaBuilder) -> {
if (StringUtils.isEmpty(teamName)) {
return null;
}
Join<Member, Team> t = root.join("team", JoinType.INNER);
return criteriaBuilder.equal(t.get("name"), teamName);
};
}
public Specification<Member> username(final String username) {
return (Specification<Member>) (root, query, builder) ->
builder.equal(root.get("username"), username);
}
}
@Test
public void specBasic() {
Team teamA = new Team("teamA");
em.persist(teamA);
Member m1 = new Member("m1", 10, teamA);
Member m2 = new Member("m2", 20, teamA);
em.persist(m1);
em.persist(m2);
em.flush();
em.clear();
Specification<Member> spec = MemberSpec.username("m1").and(MemberSpec.teamMember("teamA"));
List<Member> result = memberRepository.findAll(spec);
assertThat(result.size()).isEqualTo(1);
}
너무 복잡하다. 직관적이지 않다.