Sql Hibernate:映射字段,条件为不带外键

Sql Hibernate:映射字段,条件为不带外键,sql,hibernate,jpa,Sql,Hibernate,Jpa,我采用以下结构将跟踪设备的数据存储在MySQL数据库中(降低复杂性以简化) 我使用Hibernate在web应用程序中处理这些数据 表结构 标签 id 名称(字符串) 最后一个标签详细信息id(标签详细信息表上的外键) 标记详细信息 id tag\u id(标记表上的外键) 日期(UTC日期) lat(gps纬度,如果没有gps位置,可能为空) lng(如果没有gps位置,gps经度可能为空) 问题 我有一个要求,当我检索一个标记时,我应该得到最后一个标记详细信息(这要归功于tag\u de

我采用以下结构将跟踪设备的数据存储在MySQL数据库中(降低复杂性以简化)

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


表结构

标签
id

名称
(字符串)
最后一个标签详细信息id
(标签详细信息表上的外键)

标记详细信息
id

tag\u id
(标记表上的外键)
日期
(UTC日期)
lat
(gps纬度,如果没有gps位置,可能为空)
lng
(如果没有gps位置,gps经度可能为空)


问题

我有一个要求,当我检索一个标记时,我应该得到最后一个标记详细信息(这要归功于
tag\u detail\u id
foregin键)

现在,我还必须获得带有有效GPS位置(纬度和经度!=null)的最新标记详细信息

是否可以使用Hibernate注释而不必在
标记
表中添加
last\u tag\u detail\u gps\u id
外键

目前,我有以下映射:

标记类

@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;
@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;
TagDetail类

@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;
@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;
如果不在
标记
表中添加外键,是否可以在标记类中添加
lastTagDetailWithGPS
字段,该字段将按日期检索具有非空纬度和经度的最后一个标记详细信息?如果是这样,正确的Jpa或Hibernate注释是什么


谢谢你

你说你想:

按日期检索具有非空纬度和 经度

我认为您不需要向
标记
表中添加额外的外键,因为在
标记
实体中,您已经有了对映射为一对一的
标记细节
实体的引用。在JPA查询中,只需遍历到
TagDetail
实体并检查其属性值:
纬度
经度
日期

以下是您的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

Il正在查找hibernate注释有一个
@Where
注释,但它仅适用于集合值关系。您所说的“集合值关系”是什么意思?这是否意味着我最终不能使用Where注释来实现这一点?根据Hibernate文档,
@Where
只能在类级别上使用。但是,如果要在实体类的字段上应用注释,那么它必须是集合值关系。用
@OneToMany
@ManyToMany
注释的任何内容都是集合值关系。而
@OneToOne
@ManyToOne
关联称为单值关系。因此,在您的情况下,
@Where
将不适用,因为您使用了
@OneToOne
映射。因此,我想我需要这个外键字段