Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用手动指定的HQL联接休眠联接额外表_Java_Mysql_Hibernate_Join - Fatal编程技术网

Java 使用手动指定的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

我正在指定一个与HQL的连接,以从我的
地址
表中获取单个字段,该字段通过链接表
用户地址
用户
相关。这是可行的,但我的问题是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”