有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring数据JPA:如何在JPA规范的左连接字段中获得不同的记录

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

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

这里的主要问题是,我希望在成员(这是一个左连接)对象上有一个清晰的记录,而不是成员。以下是我尝试过的:

    @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之后,true为我提供了成员身份distinct对象而不是成员身份distinct对象

 query.distinct(true);

所以在这里,我怎样才能得到成员distinct对象,它又是一个左连接。以下是实体结构:

@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规范非常陌生,非常感谢您的帮助。提前感谢


共 (0) 个答案