2017. 2. 2.

[Query] queryDSL+JPA, and BooleanBuilder

queryDSL


: 문자열이나 XML파일에 쿼리를 직접 작성하는 대신, fluent API를 이용해 쿼리생성. 내장된 메소드를 이용해 쿼리를 작성하는 프레임워크라고 보면 된다. 처음에는 Hibernate의 쿼리를 작성하기 위해 나왔으나, 지금은 JPA, JDBC, MongoDB, RDFBean, JDO, Lucene 등을 지원한다. Creates query with fluent API instead of dealing with XML files(creating query directly). So, queryDSL is a framework with using inner methods. this is made to HQL firstly, but now this supports JPA, JDBC, MongoDB, RDFBean, JDO, Lucene and ETC.

* fluent API는 직접작성하는 것에 비해 아래의 장점이 있다.
  • defined through the return value of a called method
  • self-referential, where the new context is equivalent to the last context
  • terminated through the return of a void context.


JPA


: Java Persistent API. DB테이블은 객체지향적 특징이 없기에 자바와 같은 언어로 접근하기가 어렵다. 따라서 테이블에 객체지향적으로 접근하기 위해 나온 개념이라고 보면 된다. 하지만 직접 쿼리를 생성하지 않으므로 JPA의 메소드나 로직을 충분히 이해하고 있지 않으면 데이터 관리를 비효율적으로 하게 된다. 참고로 Hibernate의 Java ORM(Object Relationshipt Mapper) 표준이 바로 JPA다. It's hard to access objective oriented to DB tables. so JPA is made to access tables with OOP. But we have to understand enough about JPA. Bcuz if not, we will manage data so inefficiently even more than create query directly!


BooleanBuilder


: queryDSL에서 제공하는 기능이다. 쿼리표현(expression)을 작성해 boolean형으로 반환할 수 있다. 사용법은 아래와 같다. can return boolean type with creating some expression.

Look at this code :

QTbl qTbl = new QTbl();
BooleanBuilder booleanBuilder = new BooleanBuilder();
booleanBuilder.and(qTbl.status.ne((short) 0).and(qTbl.Flag.eq((short) 0)));

이런 식으로 booleanBuilder 객체를 만들어서 해당 컬럼조건을 주는 식으로 사용할 수 있다. 이때 QTbl은 본인이 연동한 DB의 테이블정보를 queryDSL에서 자동으로 자바로 가져오면서 생기는 이름이다. Q는 자동으로 붙은 prefix이고, Tbl은 본인의 테이블 이름이다. can use like this, making booleanBuilder object. at this time, "Q" is auto-generated prefix based on table entity.

...
SQLTemplates dialect = new SQLServer2008Templates();
JPASQLQuery query = new JPASQLQuery(entityManager, dialect);
query.select(...).from(qTbl).where(createQueryBuilder(prameter));
...
public BooleanBuilder createQueryBuilder(parameter) throws Exception {...}

혹은 이렇게 JPA를 통해 쿼리를에 where조건을 줄 때 booleanBuilder형을 넣어줘도 된다. 내가 한 프로젝트에서는 조건을 따로 주어야 했기 때문에 booleanBuilder형 함수를 하나 만들어서, 이를 where조건 안에서 호출하는 식으로 썼다. 이때 dialect는 어쩔 수 없이 MSSQL 2008 버전을 썼기에 호환을 위해 만든 객체이다. Or input booleanBuilder type to where of JPA. in my case, I created method that returns booleanBuilder object and call in where. and... dialect is just for compatibility with MSSQL 2008 ver(I HATE THIS, SO OLD).

댓글 없음:

댓글 쓰기