使用 join 通过 id 映射用户

Use join to map user by id

我想在 table 之间实现连接:

@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 我想从 table users 获取 select 引用 id 并将其映射到 userId 并列出与 table Transactions.

中的 ID 相匹配的应用行

我试过这个 HQL 查询:

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

我不清楚如何 select 适当的 loginid。你能指导我吗?

您可能想要加入 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 是您刚刚从示例中删除的某个数据字段,但如果不是,那么它也可能会抱怨,因为它找不到不存在的列.

看看这个话题: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 必须 在交易 table 上,您可以考虑将其设为“int”而不是“Integer” ”。如果它可以为空,则将其设置为“整数”更有用(因为与基元不同,它可以设置为可为空)。