繁体   English   中英

Spring 数据 JPA:如何在 JPA 规范中的 LEFT JOIN 字段上获得不同的记录

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

如何替换下面的 Hibernate 查询 JPA 规范

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 ";

这里的主要问题是我想要在Member (这是一个 LEFT Join) object 而不是Membership上有一个不同的记录。 以下是我尝试过的:

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

在这里应用distinct as true后给我 Membership distinct object not Member distinct object

 query.distinct(true);

所以在这里我怎样才能得到成员不同的 object ,这又是一个左连接。 下面是实体结构:

@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;
    .......
    ......
}

我对 JPA 规范非常陌生,非常感谢任何帮助。 提前致谢!!!

AFAIU 不可能将 select 子属性与 Spring 数据 JPA 存储库方法联系起来,因此无论如何您都需要一个查询Membership才能查询/repository。 如果您可以在MemberRepository上定义此方法,这将起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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