首页 > 解决方案 > Spring Data JPA Projection with select distinct

问题描述

我有一个包含文档元数据的数据库表。我现在的任务是获取包含文档类型的列表。文档类型在数据库表中不是唯一的,但我当然希望它们出现在我的列表中。sql很简单:

SELECT DISTINCT groupname, group_displayorder
FROM t_doc_metadata
ORDER BY group_displayorder;

我了解到我可以使用投影从我的实体 DocMetadata 中获取字段的子集。我解决了这个问题如下。我的实体:

@Entity
@Table(name="T_DOC_METADATA")
@Data
public class DocMetadata {
..............

    @Column(nullable=false)
    private String displayname;

    @Column(nullable=false)
    private Integer displayorder;

    @Column(nullable=false)
    private String groupname;

    @Column(name="GROUP_DISPLAYORDER",
        nullable=false)
    private Integer groupDisplayorder;

    @Column(name="METADATA_CHANGED_TS",
        nullable=false,
        columnDefinition="char")
    private String metadataChangedTimestamp;
..........
}

我的投影界面:

public interface GroupnameAndOrder {

    String getGroupname();
    Integer getGroupDisplayorder();
    void setGroupname(String name);
    void setGroupDisplayorder(int order);
}

现在我认为通过将这些行添加到我的存储库中我会非常聪明:

@Query("select distinct d.groupname, d.groupDisplayorder from DocMetadata d order by d.groupDisplayorder")  
public List<GroupnameAndOrder> findSortedGroupnames();

可悲的是,当迭代结果列表并调用getGroupname()时,结果为空。

所以我根据文档更改了存储库中的行:

public List<GroupnameAndOrder> findBy();

现在我得到了组名,但当然它们现在不是唯一的。所以它不能解决我的问题。

有没有办法接收具有唯一组名的有序列表?

标签: springjpaprojection

解决方案


你太聪明了。相反,只需编写正确的 find 方法并返回GroupnameAndOrder. 然后,Spring Data JPA 将仅检索投影所需的内容。

像这样的东西应该可以解决问题。

List<GroupnameAndOrder> findDistinctByOrderByGroupDisplayorder();

推荐阅读