0

I have these 3 entities:

Payment Transactions:

@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 Payments:

@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 Payment transactions:

@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;
    .....
}

I use these SQL requests to get proper data based in 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

Is there some way to implement these SQL requests using JPA queries?

4

1 回答 1

1

如果您使用的是 JPA 2.0,则不能JPQL与您的查询一起使用,因为您不能使用该ON子句。

一种解决方案是在实体上实现双向映射WpfPaymentPaymentTransactionsPaymentTransactions以便能够进行连接:

 @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 开始,您可以ON使用 JPQL 查询添加子句。所以对于第一个查询,它将是这样的:

      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

希望能帮助到你!

于 2019-03-12T17:34:51.207 回答