Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA标准左键连接两个不相关的表?_Java_Hibernate_Spring Data Jpa_Jpa Criteria - Fatal编程技术网

Java 如何使用JPA标准左键连接两个不相关的表?

Java 如何使用JPA标准左键连接两个不相关的表?,java,hibernate,spring-data-jpa,jpa-criteria,Java,Hibernate,Spring Data Jpa,Jpa Criteria,这里我有两个表users和orders,users有两个字段first\u name和last\u name,orders有一个字段full\u name。由于某些原因,我无法更改数据库架构 现在我有一个问题: SELECT u.* FROM users u LEFT JOIN orders o ON o.full_name = CONCAT(u.first_name, ' ', u.last_name) 我需要将其转换为JPA规范,因为它是其他规范的一部分。以下是我的尝试: 实体: @Ent

这里我有两个表
users
orders
users
有两个字段
first\u name
last\u name
orders
有一个字段
full\u 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)
}
(根目录、查询、criteraBuilder)->{
Join-Join=root.Join(???,JoinType.LEFT);
join.on(bla_条件)
}
这可行吗


谢谢

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

第一次尝试。。。 如果使用本机查询创建一个方法,会怎么样

@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();
@Query(value=“SELECT u.*”从用户u左键加入o.full\u name=CONCAT(u.first\u name,,,u.last\u name)”,nativeQuery=true)
列出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);
规范p=(用户、查询、cb)->{
返回cb.equal(
query.from(Order.class).get(“全名”),
cb.concat(user.get(“firstName”)、cb.concat(“”、user.get(“lastName”));
};
列表=oneRepo.findAll(p);

我需要规范,因为我正在构建一个复杂的查询,这是其中的一部分。谢谢。但我需要的是左外连接,因为左外连接可以将两个表连接为一个表,我可以在其中添加附加条件,甚至进行一些计算,而不仅仅是一个查找用户的规范。@haohaolee我认为使用JPA进行连接并非不可能,它需要一个相关对象的字段……谢谢。从不知道这个公式,很有趣。如果你觉得这个答案有帮助,你可以投票和/或接受它