2017-05-09 9 views
0

と、それはのような一般的なSQLクエリを持つことが可能であったRankingModelがどのように見えるHibernateはネイティブクエリは、Hibernateは< 5.2の下では5.2.10

String sql = "select a, b, sum (c) csum from a group by a, b"; 
SQLQuery q = session.createSqlQuery (sql); 
q 
    .addScalar ("a", IntegerType.INSTANCE) 
    .addScalar ("b", IntegerType.INSTANCE) 
    .addScalar ("csum", IntegerType.INSTANCE); 
q.setResultTransformer (new AliasToBeanResultTransformer (RankingModel.class)); 
List<RankingModel> results = q.list(); 

:5.2、addScalar()で、しかし

public class RankingModel 
{ 
    public int a, b, csum; 
} 

setResultTransformer()はすべて廃止されましたが、代わりにsession.createNativeQuery()を使用するように推奨されています。私は上記に最も近いと同等です:

String sql = "select a, b, sum (c) csum from a group by a, b"; 
NativeQuery<RankingModel> q = session.createNativeQuery (sql, RankingModel.class); 
List<RankingModel> results = q.list(); 

しかし、このコードはで失敗します。

org.hibernate.MappingException: Unknown entity: ... RankingModel] with root cause 
org.hibernate.MappingException: Unknown entity: ... RankingModel 
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620) 
    at org.hibernate.engine.spi.SessionFactoryImplementor.getEntityPersister(SessionFactoryImplementor.java:335) 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.getSQLLoadable(SQLQueryReturnProcessor.java:358) 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processRootReturn(SQLQueryReturnProcessor.java:411) 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:378) 
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:180) 
    at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:71) 
    at org.hibernate.engine.query.internal.NativeQueryInterpreterStandardImpl.createQueryPlan(NativeQueryInterpreterStandardImpl.java:70) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:213) 
    at org.hibernate.internal.AbstractSharedSessionContract.getNativeQueryPlan(AbstractSharedSessionContract.java:550) 
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:992) 
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:148) 

誰もが私が欠けているものを任意のアイデアがありますか?

+0

あなたは 'RankingModel.java'を投稿することができますか?そのオブジェクトはインスタンス変数として 'a'、' b'、 'sum'を持たないようです。 – lxcky

+0

javadocには、非推奨の警告の後に、このコメントがあります: '@todo 結果トランスフォーマーへの新しいアプローチを開発する '...現在、定義されている移行パスはないかもしれません。この最も近いコンセプトは 'ResultSetMapping'ですが、私はそれがresultsetトランスフォーマーほどフレキシブルであるとは確信していません。 – Thierry

答えて

0

あなたはそれが動作しますが、IDEで、それは警告をスローします

String sql = "select a, b, sum (c) csum from a group by a, b"; 
NativeQuery<?> q = session.createNativeQuery (sql); 
List<RankingModel> results = (List<RankingModel>)q.list(); 

を使用することによって解決しようとすることができます。

それとも

String sql = "select a, b, sum (c) csum from a group by a, b"; 
    NativeQuery<?> q = session.createNativeQuery (sql).addSynchronizedEntityClass(RankingModel.class); 
    List<RankingModel> results = (List<RankingModel>)q.list(); 
+0

私は開発者と話をしました。それはTODOです。 – Jonathan

0
String sql = "SELECT a, b, sum(c) csum FROM a GROUP BY a, b"; 
NativeQuery<RankingModel> q = session.createNativeQuery(sql, RankingModel.class); 
List<RankingModel> results = q.list();