2

在这里,我有两个表usersordersusers有两个字段first_namelast_name,并且orders有一个字段full_name。出于某种原因,我无法更改数据库架构。

现在我有一个查询:

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)
}

这是可行的吗?

谢谢

4

2 回答 2

1

为了沿着您尝试实施的路线走下去,您必须根据用户是否可以有多个订单,将User/中的关联映射Order为一个@OneToOne或惰性关联。@OneToMany为此,您必须映射连接操作,这是您在顶部的本机查询中映射的复杂逻辑。我建议您查看@JoinFormula@JoinColumnOrFormula作为映射该连接的方法。

于 2017-08-29T10:54:19.730 回答
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);
于 2017-08-29T11:56:23.967 回答