我想知道是否有办法在One2Many关系中获得One Side的一个领域,这是多方的聚合。
我们来看下面的例子:
@Entity
public class A {
@Id
private Long id;
@OneToMany (mappedBy="parentA")
private Collection<B> allBs;
// Here I don't know how to Map the latest B by date
private B latestB;
// Acceptable would be to have : private Date latestBDate;
}
@Entity
public class B {
@Id
private Long id;
private Date date;
@ManyToOne (targetEntity=A.class)
private A parentA;
}
我的问题是如何在A实体对象中进行字段latestB的映射而不进行任何去规范化(不与触发器/侦听器保持同步)?
也许这个question提供了一些答案,但实际上我不明白它是如何工作的,因为我仍然希望能够获取所有子对象。
感谢阅读/帮助。
PS:我将hibernate用作ORM / JPA提供程序,因此如果不存在JPA解决方案,则可以提供Hibernate解决方案。
PS2:或者只是告诉我我不应该这样做(当然有论据); - )
答案 0 :(得分:2)
请参阅,
http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Filtering.2C_Complex_Joins
基本上JPA不支持这一点,但有些JPA提供商会这样做。
你也可以, - 使变量瞬态和延迟从OneToMany初始化它,或者只提供搜索OneToMany的get方法。 - 定义另一个最新的外键。 - 删除关系,只查询最新的。
答案 1 :(得分:2)
我将hibernate用作ORM / JPA提供程序,因此如果不存在JPA解决方案,则可以提供Hibernate解决方案。
使用Date
可以实现可接受的解决方案(即为最新的B
获取@Formula
)。
@Entity
public class A {
@Id
private Long id;
@OneToMany (mappedBy="parentA")
private Collection<B> allBs;
@Formula("(select max(b.some_date) from B b where b.a_id = id)")
private Date latestBDate;
}