【问题标题】:Implement JPA request with JOIN使用 JOIN 实现 JPA 请求
【发布时间】:2019-03-12 15:58:12
【问题描述】:

我有这 3 个实体:

支付交易:

@Entity
@Table(name = "payment_transactions")
public class PaymentTransactions implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;
    .....
}

WPF 付款:

@Entity
@Table(name = "wpf_payments")
public class WpfPayments implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, updatable = false, nullable = false)
    private int id;
    ............
}

WPF Payments 支付交易:

@Entity
@Table(name = "wpf_payment_payment_transactions")
public class WpfPaymentPaymentTransactions implements Serializable {

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

    @Column(length = 4)
    private Integer wpf_payment_id;

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

我使用这些 SQL 请求来获取基于 id 的正确数据:

SELECT  `payment_transactions`.* FROM `payment_transactions` INNER JOIN `wpf_payment_payment_transactions` ON `payment_transactions`.`id` = `wpf_payment_payment_transactions`.`payment_transaction_id` WHERE `wpf_payment_payment_transactions`.`wpf_payment_id` = 75  ORDER BY `payment_transactions`.`id` ASC LIMIT 1


SELECT `payment_transactions`.* FROM `payment_transactions` INNER JOIN `wpf_payment_payment_transactions` ON `payment_transactions`.`id` = `wpf_payment_payment_transactions`.`payment_transaction_id` WHERE `wpf_payment_payment_transactions`.`wpf_payment_id` = 75

有没有办法使用 JPA 查询来实现这些 SQL 请求?

【问题讨论】:

  • 您想要JPQL 版本的SQL 查询还是使用JPA 执行它们?
  • 你能给我看看JPQL版本吗?

标签: java jpa jpa-2.0 hibernate-jpa


【解决方案1】:

如果您使用的是 JPA 2.0,则不能在查询中使用 JPQL,因为您不能使用 ON 子句。

一种解决方案是在实体WpfPaymentPaymentTransactions 上实现双向映射, PaymentTransactions 可以加入:

 @Entity
 @Table(name = "payment_transactions")
 public class PaymentTransactions implements Serializable {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 @Column(name = "id", unique = true, updatable = false, nullable = false)
 private int id;

 @OneToOne(mappedBy="paymentTransactions") //or OneToMany depending on your model
 private WpfPaymentPaymentTransactions wpfPaymentPaymentTransactions;

 }


 @Entity
 @Table(name = "wpf_payment_payment_transactions")
 public class WpfPaymentPaymentTransactions implements Serializable {

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

 @ManyToOne
 @JoinColumn(name="wpf_payment_id")
 private PaymentTransactions paymentTransactions;
 }

然后你可以像这样加入两个实体:

  SELECT t FROM PaymentTransactions t 
  INNER JOIN WpfPaymentPaymentTransactions wppt 

从 JPA 2.1 开始,您可以在 JPQL 查询中添加 ON 子句。所以对于第一个查询,它会是这样的:

      SELECT t FROM PaymentTransactions t 
      INNER JOIN WpfPaymentPaymentTransactions wppt 
      ON t.id = wppt.paymentTransactionId` 
      WHERE wppt.wpfPaymentId = :param  
      ORDER BY t.id ASC LIMIT 1

希望对你有帮助!

【讨论】:

  • 我用的是最新的JPA(spring-boot-starter-data-jpa - spring-boot-starter-parent 2.1.2.RELEASE)
  • 所以你可以在响应中使用带有 jpql 的on 子句。
  • 我在“字段列表”中收到错误未知列“t”。你知道我该如何解决吗?
  • 你能告诉我你是如何执行 jpql 查询的吗?
  • 好的。另外,如果有帮助,请投票或标记为回复。谢谢
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 2020-01-29
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多