Hibernate:集合的投影返回ArrayIndexOutOfBoundsException异常

6

我将尝试使用 Hibernate 中的投影功能获取部分对象,就像这样:

电影类:

@Table(name = "Movies")
public class Movie extends Entity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "title")
private String title;

@OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinTable(name = "Movie_Genre", joinColumns = {@JoinColumn(name = "movieId")}, inverseJoinColumns = {@JoinColumn(name = "genreId")})
private List<Genre> genres;

当用户访问htp://localhost:8080/api/movies?fields=genres时,这被称为:
电影DAO:
Criteria cr = getCurrentSession().createCriteria(Movie.class);
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("genres"), "genres");
cr.setProjection(projectionList);
cr.setResultTransformer(Transformers.aliasToBean(Movie.class));
return cr.list();

但是这将返回:
java.lang.ArrayIndexOutOfBoundsException: 0
org.hibernate.loader.criteria.CriteriaLoader.getResultRow(CriteriaLoader.java:166)

Hibernate查询:

select this_.id as y0_ from Movies this_

当您想要投射集合时,投射(Projections)是无效的...

有人能告诉我该怎么办吗?这个问题怎么解决?

提前感谢您!


1
我无法理解您试图查询的内容。 - dcernahoschi
电影类有id、标题、类型等属性,但我只想获取类型。如果我使用标题这个属性,那么就没问题。但是如果我使用类型这个属性,就会出现ArrayIndexOutOfBoundsException异常。 - TimDMeyer
还不清楚:您需要具有某些流派的所有电影吗?还是一部电影的所有流派? - dcernahoschi
我需要一份电影列表,其中每部电影都有自己的流派列表。 - TimDMeyer
1个回答

0
区别在于电影标题实际上在电影实体中有一个字段。对于集合,这是不可能的,因为数据库表没有“genres”字段。相反,有一个名为“Movie_Genre”的实体,它实际上具有对电影和流派的外键字段。
因此,在数据库级别上,没有“genres”字段,基本上只有异常有点误导性。异常在CriteriaLoader的“applyLocks”中抛出,由于数据库方言找不到“genres”列,因此返回结果中实际上没有列。
您使用的确切版本是Hibernate?
为什么要使用投影而不是Restrictions.in?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接