เข้าร่วมสองหน่วยงาน JPA ที่มีความสัมพันธ์แบบ oneToMany

ฉันมีสองเอนทิตี A, B ใน A นี้เป็นพาเรนต์และมีโครงสร้างตารางด้านล่าง

ตาราง-ก

A1-->คอลัมน์

ตาราง-B

B1-->A1 B2-->A1

ฉันต้องดึงแถว A1 และแถวที่เกี่ยวข้องในตาราง B(B1,B2) ตามเงื่อนไขของทั้งตาราง A และ B

เมื่อฉันใช้การดึงการรวมภายนอกด้านซ้าย JPA จะส่งคืนสองแถวที่มีค่าเดียวกันใน Table-b (B1-A1 หรือ B2-A1)

แม้ว่าฉันได้ลองใช้การเข้าร่วมแบบปกติแล้ว โปรดแจ้งให้เราทราบว่าฉันขาดอะไรไป

ฉันใช้ @Query เพื่อระบุแบบสอบถาม เลือกจาก TableA ด้านซ้ายเข้าร่วมดึงข้อมูล a.TablesBCollection p โดยที่ a.TableAColum =?1 และ p.TableBColumn‹>p.TableBColumn

@Entity
@Table(name = "USER", schema = "USER_PROFILE")
public class User implements java.io.Serializable {

private BigDecimal userId;
private String firstNm;
private String lastNm;
private String userIndex;
private Set<UserPhone> userPhones = new HashSet<UserPhone>(0);

public User(){
}

public User(BigDecimal userId,String firstNm,String lastNm){
this.userId=userId;
this.firstNm=firstNm;
this.lastNm=lastNm;
}

public User(BigDecimal userId,String firstNm,String lastNm,Set<UserPhone> userPhones){
this.userId=userId;
this.firstNm=firstNm;
this.lastNm=lastNm;
this.userPhones=userPhones;
}

@Id
@Column(name = "USER_ID", unique = true, nullable = false, precision = 22, scale = 0)
public BigDecimal userId() {
 return this.userId;
    }

public void setuserId(BigDecimal userId) {
        this.userId = userId;
    }


@Column(name = "FIRST_NM", nullable = false, length=50)
public String firstNm() {
 return this.firstNm;
    }

public void setfirstNm(String firstNm) {
        this.firstNm = firstNm;
    }

@Column(name = "LAST_NM", nullable = false, length=50 )
public String lastNm() {
 return this.lastNm;
    }

public void setlastNm(String lastNm) {
        this.lastNm = lastNm;
    }

@Column(name = "USER_INDEX", nullable = false, length=50 )
public String userIndex() {
 return this.userIndex;
    }

public void setUserIndex(String userIndex) {
        this.userIndex = userIndex;
    }

@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserPhone> getuserPhones() {
    return this.userPhones;
    }

public void setUserPhones(Set<UserPhone> userPhones) {
    this.userPhones = userPhones;
    }

}



@Entity
@Table(name = "USER_PHONE", schema = "USER_PROFILE")
public class UserPhone implements java.io.Serializable {

private BigDecimal userPhoneId;
private String city;
private String State;
private User user;

public UserPhone(){
}

public UserPhone(BigDecimal userPhoneId){
this.userPhoneId = userPhoneId;
}

public UserPhone(BigDecimal userPhoneId,String city,String State,User user){
this.userPhoneId = userPhoneId;
this.city = city;
this.State = State;
this.user = user;
}

@Id
@Column(name = "USER_PHONE_ID", unique = true, nullable = false, precision = 22, scale = 0)
public BigDecimal userPhoneId() {
 return this.userPhoneId;
    }

public void setUserPhoneId(BigDecimal userPhoneId) {
        this.userPhoneId = userPhoneId;
    }

@Column(name = "CITY", nullable = false, length=50 )
public String city() {
 return this.city;
    }

public void setCity(String city) {
        this.city = city;
    }

@Column(name = "STATE", nullable = false, length=50 )
public String state() {
 return this.state;
    }

public void setState(String state) {
        this.state = state;
    }

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
public User getUser() {
        return this.user;
    }

public void setUser(User user) {
        this.user = user;
    }

}

@QUERY("Select a from User a LEFT OUTER JOIN FETCH a.userPhones p where a.userIndex =?1 and p.city<>p.state")

person springbootlearner    schedule 03.04.2017    source แหล่งที่มา
comment
JPA ดำเนินการกับคลาสไม่ใช่ตาราง โพสต์เอนทิตีที่เกิดขึ้นจริง   -  person Neil Stockton    schedule 03.04.2017


คำตอบ (1)


ทำไมคุณไม่สร้างตารางฐานข้อมูลเป็น POJO โดยเชื่อมต่อ IDE ของคุณกับฐานข้อมูลของคุณ คุณสามารถ create a JPA project ใน IDE และเชื่อมต่อกับฐานข้อมูลของคุณit will ask for the relationship between columns, you can mention it there และมันจะสร้าง POJO ที่ต้องการสำหรับคุณ

person rcde0    schedule 03.04.2017