我的
@Entity
@Table(name = "Creditcard")
@AdditionalCriteria( ..... )
public class Customer implements Serializable {
@Id
@Column(name ="CustomerId")
private long customerId;
@Column(name = "cardNumber");
private String cardNumber;
@Column(name = "apply_date")
private java.sql.Date date;
}
CustomerID 1234的示例表数据:
CustomerId|cardNumber|apply_date|....other fields
----------|----------|----------|----------------
0000000123|0000000001|2013-01-01|----------------
0000000123|0000000002|2013-09-10|----------------
是的,我知道,主键必须是复合键(EmbeddedID),但我仍然需要弄明白。
由于@AdditionalCriteria,我只获得1个条目(因为另一张卡被“禁止”) 但我需要从cardNumber'1'获得'apply_date'。
这样的事情可能吗?
像:
@Column(name = "apply_date")
@GetMinValue(field_name = "CustomerId")
private java.sql.Date date;
提前致谢!
答案 0 :(得分:1)
首先,您的实体应该代表数据库中的一行,而不是所有行。因此,您的实体可能应该是“CreditCard”实体,使用“cardNumber”作为主键,或者唯一唯一标识数据库行的实体。
然后,由于CustomerId似乎是具有客户数据的表的外键,因此您将拥有与CreditCards具有1:M关系的客户实体。然后,此客户实体可以具有您在JPA postLoad事件中设置的瞬态日期属性,从JPQL查询中获取值:“从CreditCard cc中选择cc.date,其中cc.customerId =:customerId”;
设置一个仅使用CreditCard表中的单个卡/行的客户实体似乎是一个坏主意,因为当客户获得另一个信用卡时,您会做什么 - 它是同一个客户,而是一张新卡。如果使用单独的实体对象,则只需保留相同的Customer实体并分配新的信用卡对象。