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 にアクセスすると、次のように呼び出されます。

ムービー 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)

休止クエリ:

select this_.id as y0_ from Movies this_

コレクションを投影したい場合、投影は機能しません...

誰かが私に何をすべきか教えてもらえますか? これはどのように修正できますか?

前もって感謝します!

4

1 に答える 1

0

違いは、実際には映画エンティティにタイトルのフィールドがあることです。データベーステーブルに「ジャンル」フィールドがないため、コレクションの場合、これは機能しません。むしろ、映画とジャンルへの外部キー フィールドを実際に持つ「Movie_Genre」というエンティティがあります。

そのため、データベース レベルでは「ジャンル」のフィールドがなく、基本的に例外のみが少し誤解を招く可能性があります。CriteriaLoader の「applyLocks」で例外がスローされ、データベースの方言が「genres」の列を見つけられなかったため、実際には返された結果に列がありません。

使用している Hibernate の正確なバージョンはどれですか?

Restrictions.inだけでなく、プロジェクションを使用しているのはなぜですか?

于 2014-09-02T10:44:13.300 に答える