问题描述
我遇到的问题与Tinder的匹配逻辑相似,因此我以它为例。
我的用户可以通过具有带有两个用户引用的公共匹配实体来实现彼此之间的“匹配”。
@Data
@Entity
@Table(name = "match")
@EqualsAndHashCode(callSuper = true)
public class Match extends PanacheEntity {
@Column(name = "matchDate")
Calendar matchDate;
@ManyToOne
@JsonIgnore
User userA;
@ManyToOne
@JsonIgnore
User userB;
}
}
我希望对两个用户实体对象中属于该用户的所有匹配项进行单一引用,但是我需要选择(假设使用“ mappedBy”)关系的另一端,是第一用户还是第二用户。
@Data
@Entity
@Table(name = "user_")
@EqualsAndHashCode(callSuper = true)
public class User extends PanacheEntity {
@Column(name = "email")
String email;
@Column(name = "name")
String name;
// Needs to contain all "Matches",no matter if the user is referenced as "A" or "B"
@OneToMany
List<Match> matches;
}
我希望“列表”匹配项将填充以下查询所表示的对象,即与用户相关的所有匹配项,与列无关。
select distinct match.id,user_a_id,user_b_id
from match,user_
where user_.id = match.user_a_id
or user_.id = match.user_b_id
可以为我提供与我关联的任何连接对象的用户,无论我是邀请还是被邀请的人。
有什么方法可以使用Hibernate注释来实现它?
解决方法
您可以使用@JoinColumn
指定列名
连接
@Data
@Entity
@Table(name = "connection")
@EqualsAndHashCode(callSuper = true)
public class Connection extends PanacheEntity {
@ManyToOne
@JsonIgnore
@JoinColumn(name = "inviter_id")
User inviter;
@ManyToOne
@JsonIgnore
@JoinColumn(name = "invited_id")
User invited;
}
用户
@Data
@Entity
@Table(name = "user_")
@EqualsAndHashCode(callSuper = true)
public class User extends PanacheEntity {
@Column(name = "email")
String email;
@Column(name = "name")
String name;
@OneToMany(mappedBy = "inviter")
List<Connection> inviterConnections;
@OneToMany(mappedBy = "invited")
List<Connection> invitedConnections;
}
根据评论进行更新
您可以在@JoinColumns
上尝试Connection
,如下所示,但这会给您和条款。
@JoinColumns(value = {
@JoinColumn(name = "id",referencedColumnName = "inviter_id"),@JoinColumn(name = "id",referencedColumnName = "invited_id") })
User user;