1

NamedQueryこれは私Hibernateのサンプルコードです。

NamedQuery

@NamedQuery(name="com.company.generic.model.Student.getByID()",query="select name from com.company.generic.model.Student where id=:id")

Java Code

private Student getStudentNameById(Integer id)
{
    final Session session = ....
    final Query query = session.getNamedQuery("com.company.generic.model.Student.getByID()")
    .setParameter("id",id)
    .setResultTransformer(Transformers.aliasToBean(Student.class));
    final Student student = (Student)query.uniqueResult();
    return student;
}

クエリがすべての列を返す場合はresultTransformer問題なく動作しますが、少数の列のみを返す場合は戻ります

Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class com.company.generic.model.Student

私の質問は

1)。すべての列で機能するのに、いくつかの列または 1 つの列だけでは機能しない理由。

2)。resultTransformerを使用したnamedQueryとCriteriaの違いはどれですか。namedQueryにはsetProjectionが必要ですか?

3)。独自のトランスフォーマーを作成する必要がありますか? 回避策はありますか...?

どうもありがとう...

4

1 に答える 1

1

質問 #1:ほとんどの場合、選択リストのフィールドに
エイリアスを追加する必要がありますname

select s.name as name from com.company.generic.model.Student s where s.id=:id

そのため、Hibernate は で setName(String) メソッドを見つけることができますStudent.class
同等の基準を使用すると、

session.createCriteria(Student.class)
 .add(Restrictions.eq("id",id))
 .setProjection(Projections.property("name").as("name"))
 .setResultTransformer(Transformers.aliasToBean(Student.class));

質問 #2:
名前付きクエリの選択リストは射影です。

質問 #3:
上記の回答を参照してください

于 2013-08-27T22:39:00.597 に答える