4

http://www.javacodegeeks.com/2012/07/ultimate-jpa-queries-and-tips-list-part_7092.htmlで説明されているように、jpa クエリからオブジェクトを取得できます。ここまでは順調ですね。

しかし、これを頻繁に使用する必要があるため、ジェネリックを使用したいと考えています。だから代わりに

Query query = em.createQuery('select new com.model.PersonDogAmountReport(p, size(p.dogs)) from Person p');

私が欲しい

Query query = em.createQuery('select new com.model.Report<Person, Long>(p, size(p.dogs)) from Person p');

また

Query query = em.createQuery('select new com.model.Report<com.model.Person, java.lang.Long>(p, size(p.dogs)) from Person p');

. これを試すと、次の例外が発生します。

org.hibernate.hql.ast.QuerySyntaxException: expecting OPEN, found '<' near line 1

これは、私が欲しいものがサポートされていないということですか? 良い代替手段はありますか?

NamedNativeQueryresultClassを使用してもほぼ同じことが可能ですが、その方法では Person をエンティティとして取得できません。

代わりにオブジェクトを使用すると、返されたリストをキャストできません。つまり、反復する必要があります-> meh desu.

助けてくれてありがとう。

4

3 に答える 3

4

Hibernate はリフレクションを使用してレポートをインスタンス化し、入力するため、このようなレポートのインスタンスを作成することは安全ではありません。したがって、次のように簡単に実行できます。

Query query = em.createQuery('select new com.model.Report(p, size(p.dogs)) from Person p');
return (List<Report<Person, Long>>) query.list();
于 2012-11-16T12:06:17.260 に答える
3

ここで覚えておく必要があるのは、Java ジェネリックでは型消去によってすべてのジェネリック型が削除されるということです。これにより、適切なキャストを使用してaList<Person>が単に a に縮小されます。List<Object>実行時にList<Person>. したがって、このような状況では、 を入手しListて自分でキャストを行ってください。

于 2012-11-16T12:07:06.557 に答える
2

考えられるのは、自明なサブクラスを使用してジェネリック型をバインドすることです。そう:

package com.model;

public class PersonLongReport extends Report<Person, Long> {
    public PersonLongReport(Person person, Long long) {
        super(person, long);
    }
}

その後:

public List<? extends Report<Person, Long>> doQuery() {
    TypedQuery<PersonLongReport> query = em.createQuery('select new com.model.PersonLongReport(p, size(p.dogs)) from Person p', PersonLongReport.class);
    return query.getResultList();
}

その単純なサブクラスの代償として、タイプ セーフが得られます。

于 2012-11-16T13:32:09.813 に答える