Hibernate:集合的投影返回ArrayIndexOutOfBoundsException

时间:2013-03-31 08:30:57

标签: java spring hibernate partial projection

我正在尝试使用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_

当您想要投射集合时,预测不起作用......

有人可以告诉我该怎么做?如何解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:0)

不同之处在于,对于标题,您实际上在Movies实体中有一个字段。对于集合,这不起作用,因为数据库表没有字段&#34; genres&#34;。相反,有一个名为&#34; Movie_Genre&#34;这实际上是电影和流派的外键字段。

因此,在数据库级别,没有#34;类型的字段&#34;这样基本上只有Exception有点误导。异常被抛入&#34; applyLocks&#34;在CriteriaLoader中,因为数据库方言找不到&#34; genres&#34;的列。返回的结果中实际上没有列。

您使用的是哪种确切版本的Hibernate?

为什么使用投影而不仅仅是Restrictions.in?