Page History
...
JPA의 특성과 더불어 관계형 DB의 특성을 같이 잘알고 있어야 상호운영이 가능합니다. ( 난이도 업 )
검색및 집계 처리(복습)
검색 함수쿼리
장점: 바람직한 네이밍룰에의해 검색 기능을 작동시킬수있다.
단점: 아규멘트가 길어질수록,네이밍도 같이 길어진다.
Code Block | ||||
---|---|---|---|---|
| ||||
public interface AddressRepo extends CrudRepository<Address, Long>{ List<Address> findBySex(String sex); List<Address> findBySex(String sex, Sort sort); List<Address> findBySexOrderByAgeDesc(String sex); List<Address> findByAgeGreaterThan(int age); List<Address> findByAgeGreaterThanEqual(int age); List<Address> findByAgeLessThan(int age); List<Address> findByAgeBetween(int low,int high); List<Address> findByAgeGreaterThanAndSex(int age,String sex); List<Address> findByAgeGreaterThanOrSex(int age,String sex); List<Address> findByAgeIn(int age[]); } |
JPQL을 사용한 집계처리
장점:SQL친화적으로 검색 인터페이스를 작성할수 있다.
단점:지원되지 않는 SQL문은 작동안한다.
No Format |
---|
@Query("select new com.example.demo.data.AddressStatistics(t.address,AVG(t.age)) from Address t where t.age > :minage GROUP BY t.address HAVING AVG(t.age) > :filterage ") List<AddressStatistics> findRegionAvgage( @Param("minage") int minage, @Param("filterage") double filterage ); |
Native 쿼리
장점:네이티브 SQL문을 맘것 활용할수 있다.
단점:맵핑및 아규멘트전달에 어려움이 있으며, 다른 DB로의 호환성을 포기해야할수도 있다.
No Format |
---|
@Query(value="SELECT address,age,name,phoneNbr,sex FROM address " + "UNION " + "SELECT address,age,name,phoneNbr,sex FROM address2 ", nativeQuery = true) List<?> makeUniOn(); |
SQL 윈도우함수를 대체하는 랭킹처리
장점:SQL문이 지원하지 않을시 기능구현이 가능하고 어플리케이션에게 연산부담을 시킬수있다.
단점:무분별한 사용은 커스텀한 로직을 늘리는것이니 ,효율적인 SQL문 작성법부터 학습하자~
Code Block | ||||
---|---|---|---|---|
| ||||
public void RankTest() { int[] score = {Integer.MIN_VALUE}; int[] no = {0}; int[] rank = {0}; List<AddressAgeRank> ageRankList = addressRepo.findByAgeBetween(10, 90).stream() .sorted((a,b) -> b.getAge() - a.getAge() ) .map(p -> { ++no[0]; if (score[0] != p.getAge()) rank[0] = no[0]; return new AddressAgeRank(p.getName(),score[0] = p.getAge(), rank[0] ); }) .collect(Collectors.toList()); ageRankList.forEach(item ->{ System.out.println(item.toString()); }); } |
QueryDSL 지원이되는 저장소
장점:여러가지 검색옵션을 조합을 할수 있으며, 대표적으로 null 인자값에대해 유연하게 대처할수 있다.
단점: 초기셋팅이 번거럽고, DSL사용을위하 QEntityObject가 메타빌드로 자동추가 생성이 된다. (어플리케이션이 엔티티증가에따라 무거워진다는것)
Code Block | ||||
---|---|---|---|---|
| ||||
//인터페이스 선언부
public interface AddressRepoDSL extends JpaRepository<Address, Long>,
QueryDslPredicateExecutor<Address>{
}
//사용부
@Autowired
private AddressRepoDSL addressRepoDSL;
public void jpa_queryDslTest() {
QAddress userAddress = QAddress.address1;
BooleanBuilder builder = new BooleanBuilder();
builder.and(userAddress.name.eq("민수1") )
.and(userAddress.address.like("%" + "서" +"%"));
Iterable<Address> addressList = addressRepoDSL.findAll(builder);
addressList.forEach( item -> {
String itemString = String.format("%d%s %s %s %s %s",item.getId(),item.getName(),
item.getPhoneNbr(), item.getSex(),item.getAddress(),item.getAge());
System.out.println(itemString);
});
} |
...
- https://spring.io/blog/2011/02/10/getting-started-with-spring-data-jpa/
- https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html
데이터 입력
스토어 프로시져 이용
장점: 전통적인 SP개발 방식을 이용할수 있다.
단점: 형상관리 분리로 인해, 서비스로직을 분리 관리해야하며, 상태가 없기때문에 JPA 중간저장소 기능을 100%활용못할수 있음
Code Block | ||||
---|---|---|---|---|
| ||||
CREATE OR REPLACE FUNCTION addaddress( address character varying, age integer, name character varying, sex character varying, phonenbr character varying ) RETURNS integer AS $BODY$ BEGIN INSERT INTO address ( address, age, name,sex,phonenbr) VALUES( address, age, name,sex,phonenbr); return 0; END; $BODY$ LANGUAGE plpgsql VOLATILE |
No Format |
---|
public interface AddressRepo extends CrudRepository<Address, Long>{
@Procedure
public Integer addaddress(String address,Integer age, String name, String sex, String phonenbr);
}
//SP 호출방법
addressRepo.addaddress("독도", 45, "포켓몬", "남", "010-1233-3321");
//호출로그 : 실제 호출로그에는 아규멘트가 5개가아닌 6개입니다. 이것은 리턴처리가,OUT 파라메터로 자동연결되었기때문입니다.
Hibernate:
{call addaddress(?,?,?,?,?,?)} |
...