У меня есть запрос JPA ниже, который работает нормально. Мне сказали избегать явного JOIN в том, что JOIN будет заботиться самим JPA, поскольку сущности отображаются вместе.
Вот рабочий запрос:
public interface AccountRepo extends JpaRepository<CarrAccount, Integer> {
@Query(value = "select account from CarrAccount account "
+ "join account.accountDetail dtl \n"
+ "join account.customer p\n"
+ "join fetch account.carrSubAccountRelList rel\n"
+ "join rel.carrSubAccount lc\n"
+ "join rel.carrSubAccount.carrSubAccountDetail lcd\n"
+ "where dtl.sPtyId = account.accountSrcId and account.accountId = p.customerId and
account.accountSrcId = rel.sCarrSubAccountId "
+ "and rel.carrAccountId = lc.accountId and lc.accountId = lcd.ptyId and account.rowIdSystem
IN ('COH', 'CMI') and account.role = 'C' "
+ "and account.hubStateInd = 1 and account.accountNumber = ?1 and lcd.branchId = ?2")
List<CarrAccount> getCarrAccountsByAccountNumberAndBranchId(String accountNumber, String branchId);
}
Ниже это то, что я придумал
@Query(value = "select account from CarrAccount account "
+ "where account.accountDetail.sPtyId = account.accountSrcId and account.accountId = p.customerId "
+ "and account.accountSrcId = account.carrSubAccountRelList.sCarrSubAccountId "
+ "and account.carrSubAccountRelList.carrAccountId = account.carrSubAccountRelList.carrSubAccount.accountId "
+ "and account.carrSubAccountRelList.carrSubAccount.accountId = account.carrSubAccountRelList.carrSubAccount.carrSubAccountDetail.ptyId "
+ "and account.rowIdSystem IN ('COH', 'CMI') and account.role = 'C' "
+ "and account.hubStateInd = 1 and account.accountNumber = ?1 and account.carrSubAccountRelList.carrSubAccount.carrSubAccountDetail.branchId = ?2")
List<CarrAccount> getCarrAccountsByAccountNumberAndBranchId(String accountNumber, String branchId);
Здесь определены сущности JPA
@Entity
@Table(name = "C_B_PTY_XREF")
public class CarrAccount implements Serializable {
@OneToOne
@JoinColumn(name = "PKEY_SRC_OBJECT", referencedColumnName = "S_PTY_ID", insertable = false, updatable = false)
@Where(clause = "HUB_STATE_IND = 1")
private CarrAccountDetail accountDetail;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "ROWID_OBJECT")
private Customer customer;
@JsonIgnore
@OneToMany(mappedBy = "carrAccount")
@Where(clause = "REL_TP='has external customer' AND HUB_STATE_IND=1")
private List<CarrSubAccountRel> carrSubAccountRelList;
// getters and setters
}
@Entity
@Table(name = "C_B_PTY_REL_XREF")
public class CarrSubAccountRel {
@ManyToOne
@JoinColumn(name = "PTY_ID_2", referencedColumnName = "ROWID_XREF", insertable = false, updatable = false)
private CarrAccount carrAccount;
@ManyToOne
@JoinColumn(name = "PTY_ID_1", referencedColumnName = "ROWID_XREF", insertable = false, updatable = false)
private CarrSubAccount carrSubAccount;
// getters and setters
}
@Entity
@Table(name = "C_B_PTY")
public class Customer {
@OneToMany(mappedBy = "customer")
@Where(clause = "ROWID_SYSTEM IN ('COH', 'CMI') AND HUB_STATE_IND=1")
private List<CarrAccount> carrAccountList = new ArrayList<>();
// getters and setters
}
@Entity
@Table(name = "C_B_ORG_DTL_XREF")
public class CarrAccountDetail implements Serializable {
@Column(name = "S_PTY_ID")
private String sPtyId;
// getters and setters
}
@Entity
@Table(name = "C_B_PTY_XREF")
public class CarrSubAccount implements Serializable {
@OneToMany(mappedBy = "carrSubAccount")
@Where(clause = "PTY_ROLE='L' AND HUB_STATE_IND=1")
private List<CarrSubAccountRel> carrSubAccountRelList = new ArrayList<>();
@OneToOne
@JoinColumn(name = "ROWID_OBJECT", referencedColumnName = "PTY_ID",
insertable = false, updatable = false)
private CarrSubAccountDetail carrSubAccountDetail;
// getters and setters
}
@Entity
@Table(name = "C_B_ORG_DTL_XREF")
public class CarrSubAccountDetail implements Serializable {
@Column(name = "PTY_ID")
private Integer ptyId;
@Column(name = "BRANCH_ID")
private String branchId;
// getters and setters
}
Я получаю следующее исключение:
QueryException: недопустимая попытка разыменования коллекции [carraccoun0_.rowid_xref.carrSubAccountRelList] со ссылкой на свойство элемента [sCarrSubAccountId]
Так как у меня есть отношение OneToMany от CarrAccount к CarrSubAccountRel, следовательно, я использовал «fetch», чтобы получить * сущность * в условии 1016 для соединения в списке.
Как использовать функцию FETCH в WHERE, чтобы она работала?
Заранее спасибо.