I have following model and struggling with it to retrieve results from my query:
@Entity
public class MyData {
@Id
private String id;
@Column(name = "security_id")
private Long securityId;
@Version
private Long version;
@OneToOne
@JoinColumn(name = "id", referencedColumnName = "id")
private MyDataDetails myDataDetails;
MyData() {
}
//other fields here
//omitted getters/setters
}
@Entity
public class MyDataDetails {
@Id
private String id;
@Version
private Long version;
@Column(name = "owner")
private String owner;
@Column(name = "created_on")
private LocalDateTime createdOn;
MyDataDetails() {
}
//other fields here
//omitted getters/setters
}
Now I would like to query only columns: id, securityId, and myDataDetails which referes to MyDataDetails entity (not complete entity, because it has many other properties and I would like to have best performance).
When I write query:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Tuple> query = builder.createTupleQuery();
Root<MyData> root = query.from(MyData.class);
///query.select(root).distinct(true);
root.fetch(MyDataDetail_.myDataDetails, JoinType.LEFT);
query.distinct(true).multiselect(
root.get(MyDataDetail_.id),
root.get(MyDataDetail_.securityId), root.get(MyDataDetail_.myDataDetails));
entityManager.createQuery(query).getResultList().stream()
.map(tuple -> new MyDto(tuple.get(0, String.class), null, null, null, null, null, null, null, null,
null, null, null, 0, tuple.get(13, MyDataDetails.class)))
.collect(Collectors.toList());
I have following exception:
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=generatedAlias1,role=MyData.myDataDetails,tableName=*,tableAlias=***da1_,origin=**** *,columns={***0.id ,className=MyDataDetails}}] [select distinct generatedAlias0.id, generatedAlias0.securityId, generatedAlias0.myDataDetails from MyData as generatedAlias0 left join fetch generatedAlias0.myDataDetails as generatedAlias1 where ( ( 1=1 ) and ( generatedAlias0.owningAuthority=:param0 ) ) and ( 1=1 )]