简体   繁体   中英

Spring Data JPA: How to get distinct record on LEFT JOIN field in JPA Specification

How to replace below Hibernate Query with JPA Specification

String hql = "select distinct m " +
                "from Membership ms " +
                "left join ms.member m " +
                "where lower(m.lastName) = :lastName " +
                "and lower(m.firstName) = :firstName " +
                "and m.gender = :gender ";

The main problem from here is I want an distinct record on the Member (which is a LEFT Join) object rather than Membership . Below is what I tried:

    @Override
    public Specification<Member> buildSpecification(Membership m) {
        Member member = m.getMember();
        return (root, query, criteriaBuilder) -> {
                PredicateBuilder predicateBuilder = new PredicateBuilder(criteriaBuilder);
                Join<?, ?> memberJoin = root.join("member", JoinType.LEFT);
                List<Predicate> predicates = predicateBuilder
                        .addEqualLowerPredicate(member.getLastName().toLowerCase(), memberJoin.get("lastName"))
                        .addEqualLowerPredicate(member.getFirstName().toLowerCase(), memberJoin.get("firstName"))
                        .addEqualPredicate(member.getGender(), memberJoin.get("gender"))
                        .getPredicates();
                query.distinct(true);
                return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
        };
}

Here after applying distinct as true is giving me Membership distinct object not Member distinct object

 query.distinct(true);

So here how can I get Member distinct object which again a Left Join. Below is the Entity structure:

@Entity
public class Membership {

    private String memberId;
    private Date startDate;
    private Date endDate;
    @ManyToOne
    private Member member;
    .......
    ......
}

@Entity
public class Member {

    private String firstName;
    private String lastName;
    private MemberGender gender;
    .......
    ......
}

I'm very new to JPA Specification, any help is highly appreciated. Thanks in Advance!!!

AFAIU it's not possible to select a sub-property with Spring Data JPA repository methods, so you will need a query anyway if you need the query/repository root to be Membership . If you can define this method on a MemberRepository instead, this would work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM