나머지 기능들은 사실 실무에서 잘 사용하지 않는다.

약간은 편하게 듣자. 실무에서 쓰기 애매한 기능들이다.

강하게 얘기하면 실무에서 쓰지마라 ㅎㅎㅎ

사용

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);
}

너무 복잡하다. 직관적이지 않다.