複雑なJPQLを書いていると、通常のレコードの取り出しだけではなく、合計(SUM)や算出(COUNT)などのいわゆる算術関数を使うことが一般的です。
JPQLでもこれらを通常通り扱うことができます。
サンプルケースその1
検索結果がSUMやCOUNTなどの数値のみの場合
例えばid とscore(点数)のみのエンティティ(Student.classとします。)があるとし、
これの合計値を求めたい場合下記のように取り出すことができます。
1 2 |
Query query = em.createQuery(" select sum(s.score) FROM SampleTable s ", Student.class); Object sum = query.getSingleResult(); |
サンプルケースその2他のレコードと一緒に算術式も出す場合
例えば
ある会社の部署(プロパティ id, departmentName)と
社員(id,departmentiId,age)があり、ある部署の社員の年齢の合計を出したいとします。
こちらは少々複雑でDTOというクラスを作ります。
このリレーションに関しては、こちらの記事でも書いてまして、基本的には同じです。
- エンティティを継承する(エンティティのプロパティをそのまま使える)し、コンストラクタ式を使う
- 合計値やリレーションのプロパティなど既存のエンティティにないものを持てる
BushoDto
1 2 3 4 5 6 7 8 9 10 |
public BushoDto extends Busho{ private Long sumAge; public BushoDto(Busho busho,Long sum){ //busho部分の記述は省略 this.sumAge = sum; } } |
JPQLでのコード
1 2 |
Query query = em.createQuery(" select new パッケージ名.BushoDto( busho , SUM(shain.age) )FROM ~", BushoDto.class); List<BushoDto> bushoDtoList = query.getResultList(); |
上記のようにすることでO/Rマッパーを使った算術式が使えます。
参考リンク
JPQLで使用可能な算術関数
http://itref.fc2web.com/java/jpa/
GlassFish勉強会で金魚本に載ってないJPQLの話をしてきた
JPQLでの算術式のサンプルコード