当前位置: 首页 > 知识库问答 >
问题:

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

班言
2023-03-14

如何用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 as true 后,给我成员资格不同对象不是成员不同对象

 query.distinct(true);

所以在这里我如何才能获得成员不同的对象,这又是一个左连接。下面是实体结构:

@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规范很陌生,任何帮助都非常感谢。提前致谢!!!

共有1个答案

夏新翰
2023-03-14

AFAIU不可能用Spring Data JPA存储库方法来选择子属性,所以如果您需要查询/存储库根是< code>Membership,那么无论如何都需要一个查询。如果您可以在< code>MemberRepository上定义此方法,这将会起作用。

 类似资料:
  • 我正在尝试将查询转换为JPA规范,该查询包含带OR条件的连接操作。 以下是查询: 我试图编写一个规范,但在如何将多个列与OR条件连接方面遇到了障碍。 用户实体: 运营实体 我希望有一个规范来取代上面的查询

  • 我正在尝试使用Spring数据JPA Specification来查询数据,但这里有一些问题。Java代码如下: 当我注释代码“收件人NoticeJoin.fetch(UserNoticeEntity_. user, JoinType. INNER);”时,它工作正常,但当我取消注释时,我会得到错误: 所以,我想知道使用规范方式是否支持连接获取,或者我的代码有问题。我知道使用@Query(“一些h

  • 我将hibernate-orm与spring-data-jpa一起使用。我有三个实体、、声明如下: 我的目标是获得A和获取b的列表,在实体C上有一些条件,而不获取它。以下JPQL工作正常。 当我尝试使用JPA规范时,我的规范如下所示: 我正在重用由fetch操作完成的隐式连接。此连接不符合规范。它输出以下JPQL。 也就是说,没有别名。 我研究了Hibernate GitHub的源代码。我发现,有

  • 这可能很容易,但不知道怎么做。 我有一个表,可以为特定的非键列字段重复值。如何使用query Builder或Eloquent编写SQL查询,以获取该列具有不同值的行? 请注意,我不是只获取该列,它与其他列值结合在一起,所以可能无法真正工作。因此,这个问题基本上可以是如何指定我想在查询中区分的列,现在不接受任何参数?

  • 我使用Spring Boot,对于我来说,不清楚如何根据嵌套对象的属性对其进行排序,这些嵌套对象具有和,因为: 原因:org。postgresql。util。PSQLException:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在SELECT列表中 Spring Data JPA生成了错误的查询。 让我们看一个小例子: 我们有类和嵌套对象和。 类还包含。 现在,我想用

  • 我想创建基于JPA规范的过滤器。我正在使用Spring数据。 我的实体: 实体依赖项为:第1节-一对多- 我有一个转换为规范的问题过滤器类。我想了解第节中的所有问题。 通常,我会使用下面编写的SQL查询来获取部分中的所有问题。 我尝试过使用Join创建规范,但不知道如何在问题上的目标参考不可用时创建连接。