Hibernate:带有没有外键的条件的map字段

时间:2015-11-18 15:14:56

标签: sql hibernate jpa

我有以下结构来存储MySQL数据库中跟踪设备的数据(简化复杂度降低)。

我使用Hibernate在Web应用程序中处理这些数据。

表格结构

代码
id
name(字符串)
last_tag_detail_id(tag_detail表上的外键)

tag_detail
id
tag_id(标签表上的外键)
date(UTC日期)
lat(gps纬度,如果没有GPS位置,则可以为null)
lng(gps经度,可能为空无GPS位置)

问题

我要求当我检索标记时,我应该得到最后一个tag_detail(我感谢tag_detail_id foregin键)。

现在我还必须使用有效的GPS位置(纬度和经度!= null)获取最新的tag_detail。

是否可以使用Hibernate注释来实现,而无需在last_tag_detail_gps_id表中添加tag外键?

现在我有以下映射:

标记类

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private Long id;

@Column(name = "mac")
private String name;

@OneToOne(fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.REFRESH })
@JoinColumn(name = "last_tag_detail")
private TagDetail lastTagDetail;

TagDetail类

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, updatable = false, nullable = false)
private Long id;

@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH, CascadeType.MERGE })
@JoinColumn(name = "tag_id", nullable = false)
private Tag tag;

@Column(name = "lat")
private BigDecimal latitude;

@Column(name = "lng")
private BigDecimal longitude;

@Column(name = "data", nullable = false)
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime date;

是否可以在tag表中添加外键以在Tag类中添加lastTagDetailWithGPS字段,这将检索具有非零纬度和经度的最后一个TagDetail日期?如果是这样,那么正确的Jpa或Hibernate注释是什么呢?

谢谢

1 个答案:

答案 0 :(得分:0)

你说你想:

  

按日期检索具有非零纬度的最后一个TagDetail   经度

我认为您不需要在tag表中添加额外的外键,因为在Tag实体中您已经引用了TagDetail实体的引用一对一。在您的JPA查询中,您只需遍历到TagDetail实体并检查其属性的值:latitudelongitudedate

这是您的JPA查询:

SELECT td FROM Tag t INNER JOIN TagDetail td
WHERE td.date = :date AND
td.latitude IS NOT NULL AND
td.longitude IS NOT NULL