spring - 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();
现在我得到了组名,但当然它们现在不是唯一的。所以它不能解决我的问题。
有没有办法接收具有唯一组名的有序列表?
解决方案
你太聪明了。相反,只需编写正确的 find 方法并返回GroupnameAndOrder
. 然后,Spring Data JPA 将仅检索投影所需的内容。
像这样的东西应该可以解决问题。
List<GroupnameAndOrder> findDistinctByOrderByGroupDisplayorder();
推荐阅读
- java - Java 观察者模式或发布者-订阅者模式的变体
- ios - 创建自定义 UIView 时出现问题,使用 @IBOutlet 发现 Xib 错误为零
- odoo - 如何将所有字段的值从一条记录复制到另一条记录中?
- multithreading - 带有模板化构造函数的 C++ 自定义线程包装器导致插入 std::map 时出现编译时错误
- python - 更新和切换绘图
- c - 从 rand2() 生成 N 个随机数
- flutter - Flutter源码中Text小部件的RenderObject类在哪里
- nodemailer - Nodemailer 表示消息已发送并已接受,但电子邮件从未发送过 // 进程从未完成
- vb.net - vb.net如何通过byref将结构传递给线程?
- r - 如何用空格分隔日期列中的项目,并且只输出前两个日期分量(“YYYY MM”)?