簡體   English   中英

@OneToOne無法通過OpenJPA在C​​riteriaBuilder中獲取

[英]@OneToOne is not fetching in CriteriaBuilder with OpenJPA

考慮以下映射

@Table(
    name = "VerkoopOrder"
)
public class VerkoopOrder implements DatabaseEntity, Auditable {

    @Id
    @Column(
        name = "VerkoopOrderId",
        nullable = false
    )
    @GeneratedValue(
        strategy = GenerationType.IDENTITY
    )
    public Long getVerkoopOrderId() {
        return this.verkoopOrderId;
    }

    @OneToOne(
        fetch = FetchType.LAZY
    )
    @JoinColumn(
        name = "BetalingsInformatieId"
    )
    public BetalingsInformatie getBetalingsInformatie() {
        return this.betalingsInformatie;
    }
}

@Table(
    name = "BetalingsInformatie"
)
public class BetalingsInformatie implements DatabaseEntity, Auditable {
    @Id
    @Column(
        name = "BetalingsInformatieId",
        nullable = false
    )
    @GeneratedValue(
        strategy = GenerationType.IDENTITY
    )
    public Long getBetalingsInformatieId() {
        return this.betalingsInformatieId;
    }

    @OneToOne(
        mappedBy = "betalingsInformatie"
    )
    public VerkoopOrder getVerkoopOrder() {
        return this.verkoopOrder;
    }
}

我想查詢列表VerkoopOrder與一對一BetalingsInformatie內與criteriabuilder

    CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();

    CriteriaQuery<VerkoopOrder> query = builder.createQuery(VerkoopOrder.class);
    Root<VerkoopOrder> verkoopOrder = query.from(VerkoopOrder.class);
    verkoopOrder.fetch(BETALINGSINFORMATIE, JoinType.LEFT);
    Join<VerkoopOrder, VerkoopOrderLijn> verkoopOrderLijnen = verkoopOrder.join(VERKOOPORDER_LIJNEN);
    verkoopOrder.fetch(VERKOOPORDER_LIJNEN);
    query.select(verkoopOrder);
    query.distinct(true);

    PredicateBuilder predicateBuilder = new PredicateBuilder(builder, verkoopOrder);

    predicateBuilder
            .addEqualPredicate(UUID, criteria.getUuid())
            .addEqualPredicate(AANKOPER_ID, criteria.getAankoperId())
            .addEqualPredicate(verkoopOrderLijnen.get(MSISDN), criteria.getMsisdn())
            .addEqualPredicate(STATUS, criteria.getStatus())
            .addEqualPredicate(verkoopOrderLijnen.get(VERVOERCONTRACT).get(VERVOERCONTRACT_ID), criteria.getVervoerContractId())
            .addDateTimeRangePredicate(TIMESTAMP_CREATED, criteria.getTimestampCreatedStart(), criteria.getTimestampCreatedEnd())
            .addDateTimeRangePredicate(TIMESTAMP_UPDATED, criteria.getTimestampUpdatedStart(), criteria.getTimestampUpdatedEnd());

    query.where(predicateBuilder.build());
    query.orderBy(builder.desc(verkoopOrder.get(TIMESTAMP_UPDATED)));

    TypedQuery<VerkoopOrder> typedQuery = getEntityManager().createQuery(query);

    List<VerkoopOrder> verkoopOrders = typedQuery.getResultList();

但是,“ betalingsInformatie字段始終為null,(您還可以看到我正在獲取VerkoopOrderLijnen的列表,該列表已經填充得很好。我還能嘗試什么來獲取betalingsInformatie嗎?我很害怕不得不單獨查詢服務中的每個betalinginformatie字段,而不是直接來自查詢結果。

有人有見識嗎? 請記住,這是使用OpenJPA實現而不是休眠或eclipselink

惰性JPA屬性可以引發異常,也可以執行應做的事情:加載另一個實體。 您沒有看到異常->實體必須已加載。 Null可能是正確的結果。 請檢查您正在加載的特定記錄的聯接列。 我猜沒有其他實體從那里映射過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM