Spring 具有 select 不同的数据 JPA 投影

Spring Data JPA Projection with select distinct

我有一个数据库 table,其中包含文档的元数据。我现在的任务是获取包含文档类型的列表。文档类型在数据库 table 中不是唯一的,但我当然希望它们出现在我的列表中。 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();

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

有什么方法可以接收具有唯一组名的有序列表吗?

你太聪明了。相反,只需编写正确的查找方法和 return GroupnameAndOrder。 Spring Data JPA 将仅检索投影所需的内容。

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

List<GroupnameAndOrder> findDistinctByOrderByGroupDisplayorder();