如何使用JPA标准离开两个不相关的表?

如何使用JPA标准离开两个不相关的表?

问题描述:

在这里,我有两个表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) 
} 

这是可行的?

感谢

为了下井你试图实现的路径,你必须根据是否可以有多个订单User/Order内的关联映射为@OneToOne@OneToMany延迟关联为用户或不。为此,您必须映射连接操作,这是您在顶部的本机查询中映射的复杂逻辑。我建议你看看@JoinFormula@JoinColumnOrFormula作为映射该连接的方式。

+0

谢谢。从来不知道Joinformula,非常有趣。试一试 – haohaolee

+0

如果你觉得这个答案有帮助,你可以upvote和/或接受它 – dimitrisli

+0

我会接受它后,我会尝试;) – haohaolee

第一次尝试... 如果您使用本地查询创建方法,该怎么办?

@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