JPA-запрос без явного упоминания JOIN - PullRequest
1 голос
/ 16 января 2020

У меня есть запрос 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, чтобы она работала?

Заранее спасибо.

...