2

実行したいコードは次のとおりです。

Query query = getSession().createQuery("select count(*),uv.voter.gender from UserVoter uv  where " +
            "  uv.voter.age between "+startAge+" and "+endAge+" and uv.hamlet.hamletId = :hamletId  group by uv .voter.gender  ") ;
    //query.setParameter("publicationDateId",publicationDateId);
    query.setParameter("hamletId", hamletId);
      return query.list();

start パラメータと end パラメータの場合は次のとおりです。

18-25
25-35
35-45 

これら 3 つのケースでは、クエリを 3 回実行する必要があります。上記の 3 つのケースについて、1 つのクエリで結果を取得したいと考えています。についてのアイデアがありnew map() ますが、どうすればそれを行うことができますか?

出力は、次のような入力パラメーターのペアにマップする必要があります。

18-25,55,male 18-25,56,female 25-35,44,male..

mysqlで私はこれを達成します

select concat(18,'to',25),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 18 and 25 and u.hamlet_id=10 group by v.gender
union
select concat(26,'to',35),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 26 and 35 and u.hamlet_id=10 group by v.gender
union
select concat(36,'to',50),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 36 and 50 and u.hamlet_id=10 group by v.gender
union
select concat(51,'to',200),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 51 and 200 and u.hamlet_id=10 group by v.gender;

しかし、ネイティブSQLを使用せずに休止状態でその効果を得る方法は?

4

2 に答える 2

0

データベースへの1回の呼び出しでは、やりたいことを実行できません。あなたが本当に一度だけデータベースをヒットしたいなら、私はあなたの最良の選択肢は次のとおりだと思います:

select uv.voter.age, uv.voter.gender, count(*) from UserVoter uv where uv.hamlet.hamletId = :hamletId group by uv.voter.age, uv.voter.gender

これにより、(18、male、5)(18、female、4)(19、male、3)(19、female、6)..が表示されます。

次に、プログラムで結果をグループ化できます。

于 2013-02-26T14:13:53.037 に答える
0

まず、startAge と endAge のパラメーターも使用する必要があります。

次に、ケースでforループを使用してクエリを作成するために使用される文字列に、必要な他の条件を生成できます。これにより、次のようなものが得られます。

(uv.voter.age between :startAge0 and :endAge0) or (uv.voter.age between :startAge1 and :endAge1) ... 

次の文字列を簡単に生成し、namedParameters を使用してパラメーターを追加できます。この場合に位置付けられたパラメーターを好まない場合は、見てみるとよいでしょう (「?」を使用してから、インデックスを使用してパラメーターを設定します。

于 2013-02-26T13:50:52.227 に答える