我有以下结构来存储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注释是什么呢?
谢谢
答案 0 :(得分:0)
你说你想:
按日期检索具有非零纬度的最后一个TagDetail 经度
我认为您不需要在tag
表中添加额外的外键,因为在Tag
实体中您已经引用了TagDetail
实体的引用一对一。在您的JPA查询中,您只需遍历到TagDetail
实体并检查其属性的值:latitude
,longitude
和date
。
这是您的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