2017-12-11 8 views
0

hibernateを使用するJavaのSpring MVC Webアプリケーションがあります。 SQL joinを使用して複数のテーブルからデータを取得しようとしていますが、単一のクエリを使用していくつかの条件に基づいて行数をカウントしています。私が使用している現在のSQLは次の通りです:複数の結合でSQLクエリーを使用し、ハイバネートでカウントする方法

SELECT (s.school_id, u.first_name, u.last_name, u.username, u.email, p.plan_name, s.start_date, s.end_date,(SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'TA' and t.school_id = s.school_id), (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'PA' and t.school_id = s.school_id), (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'ST' and t.school_id = s.school_id)) FROM c_school s inner join u_user u on s.user_created = u.user_id inner join c_plan p on s.current_plan = p.plan_Id where s.application_id = 1 and s.site_id = 1; 

このクエリは私にとって望ましい結果を返します。私は次のようにhibernat使用して結果を得るために、私の方法でSQLクエリと同じクエリを使用しようとしています:私は参加せずにSQLクエリを使用している場合

public List<Object[]> getBuyersInformation(int applicationId, int siteId) throws HibernateException 
{ 

    Session session = getCurrentSession(); 
    Query query = session.createSQLQuery("SELECT (s.school_id, u.first_name, u.last_name, u.username, u.email, p.plan_name, s.start_date, s.end_date, s.subscription_price, (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'TA' and t.school_id = s.school_id), (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'PA' and t.school_id = s.school_id), (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'ST' and t.school_id = s.school_id)) FROM c_school s inner join u_user u WHERE s.user_created = u.user_id inner join c_plan p WHERE s.current_plan = p.plan_Id where s.application_id = :applicationId and s.site_id = :siteId"); 
    query.setParameter("applicationId", applicationId); 
    query.setParameter("siteId", siteId); 
    List<Object[]> results = query.list(); 
    if(results != null && results.size() > 0) 
    { 
    return results; 
    } 
    return null; 
} 

が、私は正しい結果を得るが、時の電流をクエリを使用すると、次の例外が発生します。

org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 

I user Postgresデータベース。目的の結果をオブジェクトのリストまたは多分カスタムクラスとして得ることができる方法はありますか?この単一のSQLを使用しようとしているのは、データベースに何千もの情報行が含まれている可能性があり、このクエリを分割するとデータベース呼び出しが多くなり、結果的にシステムが遅くなるからです。 hibernateを使用して複数の結合とカウントでSQLクエリを実行する方法はありますか?

答えて

3

列リストのかっこのため、クエリはフィールドとして選択した列を含む匿名レコードである単一の列を返します。

Postgresでselect (a,b)select a,bとは異なるものです。 2つのフィールドを持つ式(a,b)(「行コンストラクタ」とも呼ばれます)creates an anonymous record

これらの不要なカッコを削除すると、クエリはうまくいくはずです。

何かのように:それはあなたの列式にエイリアス与えることも良いでしょう、それが働いた

SELECT s.school_id, u.first_name, u.last_name, u.username, u.email, p.plan_name, s.start_date, s.end_date, 
     (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'TA' and t.school_id = s.school_id) as ta_count, 
     (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'PA' and t.school_id = s.school_id) as pa_count, 
     (SELECT COUNT(*) FROM c_school_user t WHERE t.user_type = 'ST' and t.school_id = s.school_id) as st_count 
FROM c_school s 
    inner join u_user u on s.user_created = u.user_id 
    inner join c_plan p on s.current_plan = p.plan_Id 
where s.application_id = 1 and s.site_id = 1; 
+0

を、ありがとう –

関連する問題