Page History
...
SQL | JPA | |
---|---|---|
< | WHERE 44 < age | findByAgeGreaterThan(int age); |
<= | WHERE 44 <= age | findByAgeGreaterThanEqual(int age); |
> | WHERE age < 44 | findByAgeLessThan(int age); |
범위 | WHERE age BEETWEEN 10 and 20 | findByAgeBetween(int low,int high); |
부분범위 | WHERE age in ( 34,35,36) | findByAgeIn(int age[]); |
AND | WHERE 40 < age AND sex='남' | findByAgeGreaterThanAndSex(int age,String sex); |
OR | WHERE 40 < age OR sex='여' | findByAgeGreaterThanOrSex(int age,String sex); |
GROUP BY
집계함수
함수 | 용도 | 함수 | 용도 |
---|---|---|---|
AVG | MIN | ||
COUNT | SUM | ||
COUNT_BIG | STDEV | ||
GROUPING | STDEVP | ||
GROUPING_ID | VAR | ||
CHECKSUM_AGG | VARP | ||
MAX |
집계 DTO정의
Address데이터를 가지고 특정집계 수행을 한다고 하면 , ex> 성별에따른 회원수 라고 한다면
...
Address는 이미 정의를 하였지만, 성별에 따른 회원수를 표현하는 오브젝트는 새롭게 정의할 필요가 있습니다.
정의없이 모든 Object에 대응하는 map 사용도 가능하지만, DAO정의 없을시 사용레벨에서 필드명을 파악해야하고
추후에 이에 대응하는 Object가 없을시 제어가 어려워질수 있습니다.
Code Block | ||||
---|---|---|---|---|
| ||||
package com.example.demo.data; public class AddressStatistics { private String fname; private Long cnt; public AddressStatistics(String fname,Long cnt) { this.fname = fname; this.cnt = cnt; } } |
...
처음으로 쿼리검색 조건을 JPA함수형이 아닌, SQL문과 비슷한 JQL문을 사용하였습니다JPQL문을 사용하였습니다.
DAO가 변형이되거나 복잡한 집계를 내는것은 JPA 함수쿼리로 모두 작성하기 어려우며
JPQL/네이티브SQL/Query DSL등을 같이 사용할수가 있습니다. 여기서는 가장간단하게
JPQL(JPA Query Language) 을 사용 하였습니다.
SQL | JPA |
---|---|
SELECT sex,count(*) FROM db_example.address group by sex | public interface AddressRepo extends CrudRepository<Address, Long>{ @Query("select new com.example.demo.data.AddressStatistics(t.sex,count(t) as cnt) from Address t group by t.sex") } |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
List<AddressStatistics> addressStaticBySex = addressRepo.findSexCount(); addressStaticBySex.forEach(item -> { String itemString = String.format("%s %d", item.getFname(), item.getCnt()); System.out.println(itemString); }); |
...