简体   繁体   English

@OneToOne无法通过OpenJPA在C​​riteriaBuilder中获取

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

Consider following mapping 考虑以下映射

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

I'm trying to query a list of VerkoopOrder with the one to one BetalingsInformatie inside with the criteriabuilder 我想查询列表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();

However the "betalingsInformatie field is always null , (you can also see I'm fetching a list of VerkoopOrderLijnen which is filled in just fine as it should. What else can I try to get the betalingsInformatie ? I'm dreading having to seperate query each betalinginformatie field in a service instead of straight from a query result. 但是,“ betalingsInformatie字段始终为null,(您还可以看到我正在获取VerkoopOrderLijnen的列表,该列表已经填充得很好。我还能尝试什么来获取betalingsInformatie吗?我很害怕不得不单独查询服务中的每个betalinginformatie字段,而不是直接来自查询结果。

Does anyone have any insights ? 有人有见识吗? Keep in mind this is using the OpenJPA implementation not hibernate or eclipselink 请记住,这是使用OpenJPA实现而不是休眠或eclipselink

Lazy JPA properties can either raise an exception OR they do what they are supposed to do: Load the other entity. 惰性JPA属性可以引发异常,也可以执行应做的事情:加载另一个实体。 You don't see an exception -> the entity must have loaded. 您没有看到异常->实体必须已加载。 Null is probably the correct result. Null可能是正确的结果。 Please check the join column of the particular record you are loading. 请检查您正在加载的特定记录的联接列。 I guess that no other entity is mapped from there. 我猜没有其他实体从那里映射过。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM