带有精选的

时间:2019-01-09 08:52:14

标签: spring jpa projection

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

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

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

1 个答案:

答案 0 :(得分:1)

您正试图变得太聪明。相反,只需编写适当的find方法并返回GroupnameAndOrder。然后,Spring Data JPA将仅检索投影所需的内容。

类似的事情应该可以解决。

List<GroupnameAndOrder> findDistinctByOrderByGroupDisplayorder();