Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA标准multiselect with fetch-java.lang.IllegalArgumentException:org.hibernate.QueryException_Java_Hibernate_Jpa_Criteria Api - Fatal编程技术网

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的结果,所以我不会丢失任何结果。