Мультиселект критерия JPA с выборкой - java .lang.IllegalArgumentException: org.hibernate.QueryException - PullRequest
2 голосов
/ 17 марта 2020

У меня есть следующая модель, и я борюсь с ней, чтобы получить результаты из моего запроса:

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

Теперь я хотел бы запрашивать только столбцы: id, securityId и myDataDetails, которые ссылаются на сущность MyDataDetails (не завершена) объект, потому что он имеет много других свойств, и я хотел бы иметь лучшую производительность).

Когда я пишу запрос:

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());

У меня есть следующее исключение:

Причина: java .lang.IllegalArgumentException: org.hibernate.QueryException: в запросе указана выборка соединения, но владелец извлеченной ассоциации не присутствует в списке выбора [FromElement {явный, не объединение в коллекцию, извлечение в соединении , получить не ленивые свойства, classAlias ​​= generateAlias1, role = MyData.myDataDetails, tableName = *, tableAlias ​​= *** da1_, origin = **** *, столбцы = {** * 0 .id, className = MyDataDetails}}] [выберите отдельный генерированныйAlias0.id, генерированныйAlias0.securityId, генерируемыйAlias0.myDataDetails из MyData в качестве генерированного atedAlias0.myDataDetails как генерируемый Alias1, где ((1 = 1) и (generateAlias0.owningAuthority =: param0)) и (1 = 1)]

...