Java 使用手动指定的HQL联接休眠联接额外表
我正在指定一个与HQL的连接,以从我的Java 使用手动指定的HQL联接休眠联接额外表,java,mysql,hibernate,join,Java,Mysql,Hibernate,Join,我正在指定一个与HQL的连接,以从我的地址表中获取单个字段,该字段通过链接表用户地址与用户相关。这是可行的,但我的问题是Hibernate还加入了另一个链接表users\u phoneNumbers public Country getUserCountry(Integer userId) { return (Country) entityManager.createQuery("SELECT a.country FROM User u JOIN u.address a WHER
地址
表中获取单个字段,该字段通过链接表用户地址
与用户
相关。这是可行的,但我的问题是Hibernate还加入了另一个链接表users\u phoneNumbers
public Country getUserCountry(Integer userId) {
return (Country) entityManager.createQuery("SELECT a.country FROM User u JOIN u.address a WHERE u.id = :userId")
.setParameter("userId", userId).getSingleResult();
}
以及它执行的查询:
Hibernate:
/* SELECT
a.country
FROM
User u
JOIN
u.address a
WHERE
u.id = :userId */ select
address1_.country as col_0_0_
from
users user0_
left outer join
users_phoneNumbers user0_1_
on user0_.id=user0_1_.userId_fk
left outer join
users_addresses user0_2_
on user0_.id=user0_2_.userId_fk
inner join
addresses address1_
on user0_2_.addressId=address1_.id
where
user0_.id=?
我的用户对象有一些与其他表相关的字段,但只是额外连接到电话号码
@Entity
@Table(name = "users")
@Getter
@Setter
@ToString
public class User implements Serializable {
private static final long serialVersionUID = 47483884837236327284854L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotNull
private String name;
@NotNull
private LocalDate birthDate;
private Boolean notifications = TRUE;
@OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true)
@JoinColumn(name = "userId", referencedColumnName = "id", nullable = false)
private final Set<UserSkill> skills = new HashSet<>();
@Getter(AccessLevel.NONE)
@OneToOne(fetch = EAGER, cascade = ALL)
@JoinTable(name = "users_phoneNumbers", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "phoneNumberId"))
private PhoneNumber phoneNumber;
@OneToOne(fetch = EAGER, cascade = ALL)
@JoinTable(name = "users_addresses", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "addressId"))
private Address address;
@ElementCollection(fetch = EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "users_userInterests", joinColumns = @JoinColumn(name = "userId"))
@Column(name = "userInterest")
private final Set<UserInterest> userInterests = new HashSet<>();
private String profilePhoto;
private LocalDateTime created;
private User() {
}
public User(String name, LocalDate birthDate, Set<UserSkill> skills) {
this.name = name;
this.birthDate = birthDate;
this.skills.addAll(skills);
}
public void addSkills(Collection<UserSkill> skills) {
this.skills.addAll(skills);
}
public void removeSkills(Collection<UserSkill> skills) {
this.skills.removeAll(skills);
}
public String getPhoneNumber() {
if (phoneNumber != null) {
return phoneNumber.getPhoneNumber();
} else {
return null;
}
}
public Boolean isPhoneNumberVerified() {
if (phoneNumber != null) {
return phoneNumber.getIsVerified();
} else {
return false;
}
}
@实体
@表(name=“users”)
@吸气剂
@塞特
@托斯特林
公共类用户实现可序列化{
私有静态最终长serialVersionUID=47483884837236327284854L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
@NotNull
私有字符串名称;
@NotNull
私人本地日期出生日期;
私有布尔通知=TRUE;
@OneToMany(fetch=EAGER,cascade={ALL},orphanRemoving=true)
@JoinColumn(name=“userId”,referencedColumnName=“id”,nullable=false)
私有最终集技能=新HashSet();
@Getter(AccessLevel.NONE)
@OneTONE(提取=急切,级联=全部)
@JoinTable(name=“users\u phoneNumbers”,joinColumns=@JoinColumn(name=“userId”),inverseJoinColumns=@JoinColumn(name=“phoneNumberId”))
私人电话号码;
@OneTONE(提取=急切,级联=全部)
@JoinTable(name=“users\u addresses”,joinColumns=@JoinColumn(name=“userId”),inverseJoinColumns=@JoinColumn(name=“addressId”))
私人地址;
@ElementCollection(fetch=EAGER)
@枚举(EnumType.STRING)
@CollectionTable(name=“users\u userInterests”,joinColumns=@JoinColumn(name=“userId”))
@列(name=“userInterest”)
private final Set userInterests=new HashSet();
私人字符串配置文件照片;
创建私有LocalDateTime;
私人用户(){
}
公共用户(字符串名称、LocalDate出生日期、设置技能){
this.name=名称;
this.birthDate=生日;
this.skills.addAll(skills);
}
公共技能(收集技能){
this.skills.addAll(skills);
}
公共无效移除技能(收集技能){
这个.skills.removeAll(skills);
}
公共字符串getPhoneNumber(){
如果(电话号码!=null){
返回phoneNumber.getPhoneNumber();
}否则{
返回null;
}
}
公共布尔值isPhoneNumberVerified(){
如果(电话号码!=null){
返回phoneNumber.getIsVerified();
}否则{
返回false;
}
}
我怀疑这可能与电话号码相关的getter有关,但这只是一个想法
为什么会发生这种情况?我如何避免它?什么是
@Getter(AccessLevel.NONE)
?@DraganBozanovic这是一个Lombok注释。它的意思是“不自动生成此字段的Getter”什么是@Getter(AccessLevel.NONE)
?@DraganBozanovic,这是Lombok注释。它的意思是“不自动为该字段生成getter”