JPA标准multiselect with fetch-java.lang.IllegalArgumentException:org.hibernate.QueryException
我有以下模型,并努力使用它从我的查询中检索结果:JPA标准multiselect with fetch-java.lang.IllegalArgumentException:org.hibernate.QueryException,java,hibernate,jpa,criteria-api,Java,Hibernate,Jpa,Criteria Api,我有以下模型,并努力使用它从我的查询中检索结果: @Entity public class MyData { @Id private String id; @Column(name = "security_id") private Long securityId; @Version private Long version; @OneToOne @JoinColumn(name = "id", referencedColum
@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());
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createTupleQuery();
Root=query.from(MyData.class);
///query.select(root).distinct(true);
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,0,tuple.get(13,MyDataDetails.class)))
.collect(Collectors.toList());
我有以下例外:
原因:java.lang.IllegalArgumentException:
org.hibernate.QueryException:查询指定的联接获取,但
所提取关联的所有者不在选择列表中
[FromElement{显式,不是集合联接,获取联接,获取非惰性
属性,classAlias=generatedAlias1,role=MyData.myDataDetails,tableName=*,tableAlias=***da1,origin=****
*,columns={***0.id,className=MyDataDetails}}][select distinct generatedAlias0.id,
GenerateDias0.securityId,来自MyData的GenerateDias0.myDataDetails
as generatedAlias0左连接获取generatedAlias0.myDataDetails as
生成的lias1,其中((1=1)和(
generatedAlias0.owningAuthority=:param0)和(1=1)]
我没有选择root.get(MyDataDetail\u0.myDataDetails),而是分别选择了myDataDetails的每个字段root.get(MyDataDetail\u0.myDataDetails.get(“someField”),以左连接方式获取数据,我在sql查询中没有看到innej连接,也没有看到使用myDataDetails的结果,所以我不会丢失任何结果。