Reputation: 1247
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
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.
Does anyone have any insights ? Keep in mind this is using the OpenJPA implementation not hibernate or eclipselink
Upvotes: 0
Views: 314
Reputation: 973
Lazy JPA properties can either raise an exception OR they do what they are supposed to do: Load the other entity. You don't see an exception -> the entity must have loaded. Null is probably the correct result. Please check the join column of the particular record you are loading. I guess that no other entity is mapped from there.
Upvotes: 2