6

我正在尝试使用休眠中的投影来取回部分对象,如下所示:

电影类:

@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 这被称为:

电影道:

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)

休眠查询:

select this_.id as y0_ from Movies this_

当您想要投影集合时,投影不起作用...

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

提前致谢!

4

1 回答 1

0

不同之处在于,对于标题,您实际上在 Movies 实体中有一个字段。对于集合,这不起作用,因为数据库表没有字段“流派”。而是有一个名为“Movie_Genre”的实体,它实际上具有电影和流派的外键字段。

所以在数据库级别没有“流派”字段,因此基本上只有例外有点误导。在 CriteriaLoader 的“applyLocks”中引发了异常,并且由于数据库方言找不到“流派”的列,因此返回的结果中实际上没有列。

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

您为什么使用预测而不只是 Restrictions.in?

于 2014-09-02T10:44:13.300 回答