【问题标题】:How can I left join two unrelated tables using JPA Criteria?如何使用 JPA Criteria 加入两个不相关的表?
【发布时间】:2017-08-29 10:24:44
【问题描述】:

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

这可行吗?

谢谢

【问题讨论】:

    标签: java hibernate spring-data-jpa jpa-criteria


    【解决方案1】:

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

    【讨论】:

    • 谢谢。从来不知道Joinformula,很有趣。会试一试
    • 如果你觉得这个答案有帮助,你可以投票和/或接受它
    【解决方案2】:

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

    @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);
    

    【讨论】:

    • 我需要规范,因为我正在构建一个复杂的查询,这是其中的一部分
    • 谢谢你。但我需要的是左外连接,因为左外连接可以将两个表连接为一个表,我可以在其中添加附加条件甚至一些计算,而不仅仅是查找用户的规范。
    • @haohaolee 我认为使用 JPA 并非不可能,要加入它需要一个相关对象的字段...
    猜你喜欢
    • 2016-11-09
    • 2012-01-11
    • 2017-06-09
    • 2013-06-10
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多