【问题标题】:Distinct on specific column using JPA Specification使用 JPA 规范区分特定列
【发布时间】:2021-10-13 00:57:42
【问题描述】:

我正在尝试使用 JPA 规范编写以下查询。 从 hcp 中选择不同的名称,其中 area = 'Dhaka';

select distinct name from hcp where area = 'Dhaka';

hcp 实体如下所示

@Entity
public class HCP implements Serializable {

    @Id
    @Column
    private String id;

    @Column
    private String name;

    @Column
    private String area;
}

表格应该是这样的

我尝试使用 jpa-specification 转换上述查询,如下所示。它正在选择“名称”字段,我已将 distinct 设置为 true

List<HCP> result = hcpRepository.findAll(new Specification<HCP>() {
            @Override
            public Predicate toPredicate(Root<HCP> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                query.select(root.get("name")).distinct(true);
                return criteriaBuilder.equal(root.get("area"), "Dhaka");
            }
        });

但它不起作用。它仅在具有 @Id 注释的字段上应用区。我想在 area 字段上应用 distinct。

生成的 Hibernate 查询如下所示:

select
        distinct hcp0_.id as id1_0_,
        hcp0_.area as area2_0_,
        hcp0_.name as name3_0_ 
    from
        hcp hcp0_ 
    where
        hcp0_.area=?

如何获得如下生成的查询?

select
        distinct hcp0_.name as name3_0_
        from
            hcp hcp0_
        where
            hcp0_.area= 'Dhaka'

所需的结果将根据区域列出不同的名称。 如何使用 JPA 规范在特定字段上应用 distinct?

所需的查询和输出:

【问题讨论】:

  • 但是你想要 HCP 作为结果。所以你不能像这样使用 distinct 。您的查询结果应该是什么?
  • @SimonMartinelli 您好,感谢您指出。我已经用所需的输出和更多信息更新了这个问题。希望它能澄清你的问题。

标签: spring-boot hibernate spring-data-jpa


【解决方案1】:

您不能使用规范,因为您想返回一个字符串列表。

所以你可以使用 JPQL

@Query("select distinct h.name from Hcp h where area = 'Dhaka'")
List<String> findDistinctName();

【讨论】:

  • 谢谢。如果不是字符串列表,那么是否可以使用规范获取计数?喜欢select count(distinct name) from hcp where area = 'Dhaka'; 或者为此我也需要使用 JPQL。
  • 您不应该为此使用规范。这将是 "select count(h) from hcp h where area = 'Dhaka' group by h.name"
猜你喜欢
  • 2020-03-03
  • 2021-01-21
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多