【问题标题】:Implement JOIN with several tables用几个表实现 JOIN
【发布时间】:2020-01-29 06:07:01
【问题描述】:

我有这张表,我想从中选择许多行并使用 JOIN 将两个表中的 id 转换为 name。我试过这个:

主表:

@Entity
@Table(name = "payment_transactions")
public class PaymentTransactions implements Serializable {
    ..... 
    @Column(length = 4)
    private Integer merchant_id;

    @Column(length = 4)
    private Integer terminal_id; 
    ......
}

带有附加数据的表格:

@Entity
@Table(name = "merchants")
public class Merchants implements Serializable {

    @Column(name = "id")
    private int id;

    @Column(length = 255)
    private String name;
    .........
}


@Entity
@Table(name = "terminals")
public class Terminals implements Serializable {

    @Column(name = "id")
    private int id;

    @Column(length = 255)
    private String name;
    .........
}

我试过了:

String hql = "select e.* from " + PaymentTransactions.class.getName() + " e "
                + " INNER JOIN " + Merchants.class.getName() + " m "
                + " ON e.id = m.merchant_id AND " 
                + " INNER JOIN " + Terminals.class.getName() + " t "
                + " ON e.id = t.terminal_id "
                + " where e.created_at >= :start_date and e.created_at <= :end_date";

一般的想法是我想要一个主表Payment transactions,它将merchant_idterminal_id 存储为数字。通过加入,我想获得商家和终端的名称。实现这一点的正确方法是什么?

【问题讨论】:

    标签: java mysql sql jpa jpql


    【解决方案1】:

    您只需将这些变量添加到查询中的列列表中:

    String hql = "select e.*, m.name AS merchant, t.name AS terminal"
                    + " FROM " + PaymentTransactions.class.getName() + " e "
                    + " INNER JOIN " + Merchants.class.getName() + " m "
                    + " ON e.id = m.merchant_id AND " 
                    + " INNER JOIN " + Terminals.class.getName() + " t "
                    + " ON e.id = t.terminal_id "
                    + " where e.created_at >= :start_date and e.created_at <= :end_date";
    

    请注意,您需要添加列别名以避免在输出结果中出现两次相同的列名 (name)。查询包括这些(例如m.name AS merchant),因此您可以在获取结果时以merchant 列的形式访问商家名称。

    【讨论】:

    • 使用AS关键字,正如本例所示select e.*, m.name AS merchant,其中merchant是别名
    • @PeterPenzov 我已经在查询中添加了列别名 (m.name AS merchant)
    • 这回答了您的问题吗?如果没有,您能否提供更多信息来帮助回答?否则,请考虑将答案标记为已接受(上/下投票箭头下的复选标记)。见stackoverflow.com/help/someone-answers
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2012-09-17
    • 2014-11-16
    • 1970-01-01
    相关资源
    最近更新 更多