使用select distinct的Spring Data JPA投影

4

我有一个数据库表,用于存储文档元数据。我的任务是获取一个文档类型列表。虽然在数据库表中文档类型不是唯一的,但我希望它们在我的列表中是唯一的。这个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();

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

有没有办法获得一个按顺序排列且唯一的组名列表?


如果使用自定义查询进行注释,我们如何获得唯一结果? - Arvind
1个回答

7
你试图过于聪明。相反,只需编写正确的查找方法并返回GroupnameAndOrder。Spring Data JPA将仅检索投影所需的内容。
像这样的东西应该就可以了。
List<GroupnameAndOrder> findDistinctByOrderByGroupDisplayorder();

这么简单?!谢谢你。如果其他人遇到同样的问题,我必须添加一个微小的更正:方法名称应该是findDistinctByOrderByGroupDisplayorder(); "distinct"和"orderBy"之间的"By"是必不可少的,因为我没有使用任何参数进行排序。 - Raistlin
你是对的,我打得太快了……已修改答案。 - M. Deinum
3
遗憾的是,当自动生成的查找方法不可行时,在@Query中使用select distinct无法解决问题。 - Phu Ngo
1
看起来是这个问题: https://jira.spring.io/browse/DATAJPA-1679 - wutzebaer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接