【问题标题】:Use join to map user by id使用 join 按 id 映射用户
【发布时间】:2021-06-18 15:12:21
【问题描述】:

我要实现表之间的Join:

@Table(name = "users")
public class Users implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(length = 255)
    private String login;
}

@Table(name = "transactions")
public class Transactions implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;

    @Column(name = "user_id", length = 20)
    private Integer userId;
}

使用 login 我想从表 users 中选择引用 id 并将其映射到 userId 并列出与表 Transactions 中的 id 匹配的应用行。

我试过这个 HQL 查询:

SELECT c FROM Users u LEFT JOIN Transactions t ON u.id = t.id;

我不清楚如何选择合适的loginid。你能指导我吗?

【问题讨论】:

    标签: sql hibernate spring-data-jpa spring-data hql


    【解决方案1】:

    看看这个帖子:How to join two unrelated entities using JPA and Hibernate

    前两个答案很好地展示了如何构建左连接以及基于您的休眠版本的含义(即您是否可以或是否必须恢复到 SQL)。请注意,您可以期望返回的每一行都包含两个对象之一..

    还有其他方法可以将这种关系映射到懒惰的 oneToManys 以及您可以接受的其他方法,但这超出了所问问题的范围。

    至于在哪里过滤用户,它会在你的 where 子句中......即

    select ... WHERE user.id = transaction.user_id AND user.login = 'steve@minecraft.net';
    

    同样不相关,但如果您的 user_id 必须在事务表上,您可以考虑将其设为“int”而不是“Integer”。如果它可以为空,则将其设置为“整数”会更有用(因为与原语不同,它可以设置为可空)。

    【讨论】:

      【解决方案2】:

      您可能希望加入u.idt.user_id,而不是尝试将事务ID 加入用户ID。由于事务 ID 可能只是一个递增的整数,我认为它与用户 ID 没有任何关系。

      SELECT c FROM Users AS u LEFT JOIN Transactions AS t ON u.id = t.id;
      

      我假设列 c 是您刚刚从示例中删除的一些数据字段,但如果不是,那么它也可能会抱怨,因为它找不到不存在的列。

      【讨论】:

      • 但我想我还需要添加where u.login = "some user"?添加它的正确方法是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2019-11-26
      • 2020-08-17
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多