JPA Criteria multiselect with fetch - java.lang.IllegalArgumentException: org.hibernate.QueryException

Viewed 353

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 )]

0 Answers
Related