如何使用JPA标准离开两个不相关的表?
问题描述:
在这里,我有两个表users
和orders
,users
有两个字段first_name
和last_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作为映射该连接的方式。
答
第一次尝试... 如果您使用本地查询创建方法,该怎么办?
@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);
谢谢。从来不知道Joinformula,非常有趣。试一试 – haohaolee
如果你觉得这个答案有帮助,你可以upvote和/或接受它 – dimitrisli
我会接受它后,我会尝试;) – haohaolee