【问题标题】:Java/JPA Select unique entitiesJava/JPA 选择唯一实体
【发布时间】:2013-10-12 11:34:01
【问题描述】:

我正在使用 JPA 来存储具有创建日期的实体。我想每个日期选择一个实体。我不在乎哪一个,每个创建日期只需要一个。我一直在尝试子选择子句,但我无法让它们工作。有人有什么想法吗?

基本上我有以下实体:

@Entity
class E {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    @Temporal(TemporalType.DATE)
    private Date creationDate;
}

我想从表格中选择以下内容:

ID    DATE
1     3/4/5 <-- SELECT
2     3/4/5
3     4/4/5 <-- SELECT
4     5/4/5 <-- SELECT
5     5/4/5
6     5/4/5

作为一种解决方法,我选择日期“SELECT DISTINCT(e.creationDate) ...”,然后为每个日期选择实体,但似乎没有限制?所以我基本上不得不选择整个表格。

【问题讨论】:

  • 您可能可以通过在 Id 上的最小值和加入来做到这一点

标签: java jpa entitymanager


【解决方案1】:

您可以覆盖类Eequals() 方法以在相等日期返回true。有了这个,将从数据库中获取的所有实体不受任何约束地放入Set。该集合将根据日期为您消除重复项(因为您的 equals 方法是以这种方式编写的)。

【讨论】:

  • 好主意...但是,我还在数据库中存储了一些二进制数据,我不想仅仅为了不使用它而将其检索出来。也许我需要将数据拆分为多个表,但这只会是 1:1 的关系。你已经为我指明了解决方法的方向,所以谢谢你,但它并没有真正给我想要的。
  • 如果不是完整的,你无论如何都会加载一半的二进制数据,因为这是你的要求。另外,子查询会选择不同的日期和外部查询以获取该子查询上的实体,这有什么问题?我认为这没有任何问题。
  • 我试过了,但它不起作用,子查询获取每个唯一日期,但我不能限制外部查询每个日期选择一个项目,所以结果只是整张桌子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多