这里我有两个表users
和orders
,users
有两个字段first_name
和last_name
,而orders
有一个字段{ {1}}。出于某种原因,我无法更改数据库架构。
现在我有一个问题:
full_name
我需要将其转换为JPA规范,因为它是其他规范的一部分。以下是我的尝试:
实体:
SELECT u.* FROM users u LEFT JOIN orders o ON o.full_name = CONCAT(u.first_name, ' ', u.last_name)
问题是,我应该为第一个参数
填写以下语句@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;
}
这可行吗?
由于
答案 0 :(得分:1)
为了沿着您尝试实施的路线前进,您必须将User
/ Order
内的关联映射为@OneToOne
或{{1基于用户是否可以有多个订单的懒惰关联。为此,您必须映射连接操作,该操作是您在顶部的本机查询中映射的复杂逻辑。我建议您查看@JoinFormula和@JoinColumnOrFormula作为映射该联接的方法。
答案 1 :(得分: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);