2017-08-29 55 views
1

在這裏,我有兩個表usersordersusers有兩個字段first_namelast_name,並orders有一個字段full_name。出於某種原因,我無法更改數據庫模式。如何使用JPA標準離開兩個不相關的表?

現在我有一個查詢:

SELECT u.* FROM users u LEFT JOIN orders o ON o.full_name = CONCAT(u.first_name, ' ', u.last_name) 

我需要轉換成JPA規範這一點,因爲這是其他規格的一部分。以下是我的嘗試:

實體:

@Entity 
@Table(name = "users") 
class User { 
    @Id 
    private Integer id; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 
} 

@Entity 
@Table(name = "orders") 
class Order { 
    @Id 
    private Integer orderId; 

    @Column(name = "full_name") 
    private String fullName; 
} 

的問題是,我應該怎麼填寫以下語句將第一個參數

(root, query, criteraBuilder) -> { 
    Join<User,Order> join = root.join(???,JoinType.LEFT); 
    join.on(blablabla_condition) 
} 

這是可行的?

感謝

回答

1

爲了下井你試圖實現的路徑,你必須根據是否可以有多個訂單User/Order內的關聯映射爲@OneToOne@OneToMany延遲關聯爲用戶或不。爲此,您必須映射連接操作,這是您在頂部的本機查詢中映射的複雜邏輯。我建議你看看@JoinFormula@JoinColumnOrFormula作爲映射該連接的方式。

+0

謝謝。從來不知道Joinformula,非常有趣。試一試 – haohaolee

+0

如果你覺得這個答案有幫助,你可以upvote和/或接受它 – dimitrisli

+0

我會接受它後,我會嘗試;) – haohaolee

0

第一次嘗試... 如果您使用本地查詢創建方法,該怎麼辦?

@Query(value = "SELECT u.* FROM users u LEFT JOIN orders o ON o.full_name = CONCAT(u.first_name, ' ', u.last_name)", nativeQuery = true) 
List<User> getUserJoinedWithOrder(); 

修訂

Specification<One> p = (user, query, cb) -> { 
    return cb.equal(
      query.from(Order.class).get("fullName"), 
      cb.concat(user.get("firstName"), cb.concat(" ", user.get("lastName")))); 
}; 

List<One> list = oneRepo.findAll(p); 
+0

我需要規範,因爲我正在建立一個複雜的查詢,這是一個部分 – haohaolee

+0

@haohaolee清..會認爲... – Cepr0

+0

@haohaolee嘗試更新... – Cepr0