Java에 좋은 동적 SQL 빌더 라이브러리가 있습니까? [닫은]


108

누구나 Squiggle 과 같은 Java 용 좋은 SQL 빌더 라이브러리를 알고 있습니다 (더 이상 유지되지 않는 것 같습니다). 가급적이면 적극적으로 개발중인 프로젝트입니다.

가급적 Zend_Db_Select 와 같은 구문 을 사용하면 다음과 같은 쿼리를 만들 수 있습니다.

String query = db.select().from('products').order('product_id');

"SELECT f1..fn FROM products ORDER BY product_id"에 대해 위 구문의 장점이 무엇인지 물어봐도 될까요?
— Itay Moav -Malimovka 2013 년

4
@ ItayMoav-Malimovka, 글쎄요, 적어도 제 경우에는 (JOOQ를 예로 든다면) SQL 쿼리 구문은 코드를 작성할 때 확인됩니다. 쿼리 작성 속도를 높이고 오류 발생 가능성을 높이는 전체 구문 자동 완성 기능이 있습니다.
— Vladislav Rastrusny

나는 이것이 IDE가 개선해야 할 부분이라는 데 동의합니다.
— Itay Moav -Malimovka

1
@ ItayMoav-Malimovka, 음 ... JOOQ의 경우 DB 구조에서 무언가를 변경하면 새로운 DB 구조에 따라 수정할 때까지 코드 컴파일이 중지됩니다. 텍스트로 쿼리가 있으면 깨진 상태로 남습니다.
— Vladislav Rastrusny

예를 들어, 저는 현재 방대한 레거시 데이터베이스에서 작동하도록 명령문을 생성해야하는 애플리케이션을 작업하고 있습니다. 많은 명령문은 SQL DSL에 의해 구축 된 사용자 지정 제약 조건을 공유합니다. 덕분에 컴파일 타임에 알려지지 않은 문을 쉽게 만들 수 있습니다.
— Rafael Winterhalter

답변:


54

Querydsl 및 jOOQ 는 두 가지 인기있는 선택입니다.


6
JOOQ는 하드 코어 SQL 개발에 더 나은 선택 일 수 있지만 Querydsl은 더 간단한 API를 가지고 있으며 다른 백엔드 (JPA, JDO, Lucene, Mongodb 등)도 지원합니다. 나는 Querydsl 뒤에 회사도입니다
— 티모 Westkämper

우리는 몇 가지 사내 프로젝트에서 Querydsl SQL을 사용합니다. jooq에 대한 개인적인 경험은 없지만 괜찮다고 들었습니다.
— ponzao 2011

11
QueryDsl의 문제점은 생성 된 쿼리 자체를 제공하지 않으므로 순수 쿼리 생성기로 사용할 수 없다는 것입니다. 쿼리를 생성하고 실행합니다. 다른 사람 없이는 얻을 수 없습니다.
— Abhinav Sarkar 2013 년

5
Querydsl과 jOOQ는 가장 인기 있고 성숙한 선택으로 보이지만 한 가지 알아야 할 것이 있습니다. 둘 다 데이터베이스 테이블 및 필드에 대해 메타 클래스가 생성되는 코드 생성 개념에 의존합니다. 이것은 멋지고 깨끗한 DSL을 용이하게하지만 위의 OP의 예에서와 같이 런타임에만 알려진 데이터베이스에 대한 쿼리를 만들려고 할 때 문제에 직면합니다. jOOQ는 String 기반 접근을 지원하지만 몇 가지 단점이 있습니다. Querydsl의 문서에는 코드 생성을 사용하지 않는 것이 가능한지 여부가 언급되어 있지 않습니다. 내가 틀렸다면 나를 고쳐주세요.
— Sven Jacobs

3
아주 오래된 의견을 @SvenJacobs 만 업데이트하려면 QueryDSL 코드 생성하지 않고 SQL을 구축 할 수 않습니다 stackoverflow.com/questions/21615956/...
— 인 Nagaraj Tantri

7

ddlutils 가 최선의 선택입니다 : http://db.apache.org/ddlutils/api/org/apache/ddlutils/platform/SqlBuilder.html

다음은 예제 (groovy)를 만듭니다.

Platform platform  = PlatformFactory.createNewPlatformInstance("oracle");//db2,...
//create schema    
def db =        new Database();
def t = new Table(name:"t1",description:"XXX");
def col1 = new Column(primaryKey:true,name:"id",type:"bigint",required:true);
t.addColumn(col1);
t.addColumn(new Column(name:"c2",type:"DECIMAL",size:"8,2"));
t.addColumn( new Column(name:"c3",type:"varchar"));
t.addColumn(new Column(name:"c4",type:"TIMESTAMP",description:"date"));        
db.addTable(t);
println platform.getCreateModelSql(db, false, false)

//you can read Table Object from  platform.readModelFromDatabase(....)
def sqlbuilder = platform.getSqlBuilder();
println "insert:"+sqlbuilder.getInsertSql(t,["id":1,c2:3],false);
println "update:"+sqlbuilder.getUpdateSql(t,["id":1,c2:3],false);
println "delete:"+sqlbuilder.getDeleteSql(t,["id":1,c2:3],false);
//http://db.apache.org/ddlutils/database-support.html

1
이미 @Entity에서 정의했지만 열을 다시 정의해야하므로 고통 스럽습니다.
— huuthang

6

jOOQ 를 추천 할 수 있습니다 . 그것은 많은 훌륭한 기능과 SQL을위한 직관적 인 DSL 및 매우 사용자 정의 가능한 리버스 엔지니어링 접근 방식을 제공합니다.

jOOQ는 유창하고 직관적 인 DSL에서 복잡한 SQL, 유형 안전성, 소스 코드 생성, 활성 레코드, 저장 프로 시저, 고급 데이터 유형 및 Java를 효과적으로 결합합니다.


당신은 그것을 사용합니까? 어떻게 찾습니까?
— Vladislav Rastrusny 2011

3
DDL에서 사용자 지정 소스 코드를 생성하는 데 사용합니다. 잘 작동합니다!
— Christopher Klewes 2011

"jOOQ 라이브러리에는 SQL 문을 작성하기위한 훌륭한 API가 있지만 문을 작성하고, 데이터베이스에 연결하고, 데이터베이스에서 모델을 작성 / 읽는 등의 전체 도구 모음이 함께 제공됩니다. Android 애플리케이션 VM의 현재 특성으로 인해 , 64k 메서드 참조 제한이 있습니다. jOOQ는 사용 중일 때 10,000 개 이상의 참조 된 메서드를 포함 할 수 있습니다. 이는 제한에 비해 크게 보이지 않을 수 있지만 일반적으로 사용되는 다른 대형 라이브러리 (예 : Guava 및 Google Play 서비스)를 고려하는 경우 , 64k 제한에 도달하는 것이 훨씬 쉬워집니다. " - android-arsenal.com/details/1/3202 :(
— 토마스 Fejfar

3

Hibernate Criteria API (일반 SQL은 아니지만 매우 강력하고 활발한 개발 중) :

List sales = session.createCriteria(Sale.class)
         .add(Expression.ge("date",startDate);
         .add(Expression.le("date",endDate);
         .addOrder( Order.asc("date") )
         .setFirstResult(0)
         .setMaxResults(10)
         .list();

1
문제는 내가 이해하는 것처럼 SQL에 매핑되지 않는다는 것입니다.
— Vladislav Rastrusny 2011

7
이것은 SQL을 생성하지 않으며 최소한 경악의 규칙을 따르지 않을 때 디버깅하는 악몽입니다 (예상대로 작동하지 않음)

결국 SQL을 생성하고 아무도 놀라지 않습니다. 이점-데이터베이스간에 이식 가능합니다.
— Vladimir Dyuzhev 2011

3
쿼리를 완전히 읽을 수 없게 만들지 않고 JPA Criteria API를 사용하여 도달 한 쿼리 복잡성 수준은 얼마입니까? IN/ EXISTS절 에 중첩 된 선택의 예가 Sale있습니까? 아니면 엔티티에 대한 별칭을 사용하는 자체 조인 의 예가 있습니까? 궁금 해요
— 루카스 에더

1
주석은 예제를 제공 할 공간을 많이 제공하지 않지만 docs.jboss.org/hibernate/core/3.5/reference/en/html/…
— Vladimir Dyuzhev 2011

0

다음 라이브러리를 사용할 수 있습니다.

https://github.com/pnowy/NativeCriteria

라이브러리는 Hibernate "create sql query"위에 구축되어 Hibernate에서 지원하는 모든 데이터베이스를 지원합니다 (Hibernate 세션 및 JPA 공급자가 지원됨). 빌더 패턴 등을 사용할 수 있습니다 (개체 매퍼, 결과 매퍼).

github 페이지에서 예제를 찾을 수 있으며 라이브러리는 물론 Maven 중앙에서 사용할 수 있습니다.

NativeCriteria c = new NativeCriteria(new HibernateQueryProvider(hibernateSession), "table_name", "alias");
c.addJoin(NativeExps.innerJoin("table_name_to_join", "alias2", "alias.left_column", "alias2.right_column"));
c.setProjection(NativeExps.projection().addProjection(Lists.newArrayList("alias.table_column","alias2.table_column")));

이것은 손으로 SQL을 작성하는 것보다 더 복잡합니다
— EpicPandaForce

@EpicPandaForce 저는 매우 간단한 경우에 동의하지만이 조건의 다른 세트가있는 매우 복잡한 조건을 기반으로 해당 문자열을 연결해야 할 때 연결이 훨씬 복잡합니다. 올바르게 연결된 문자열 (모든 추가, 조인, 포함, 매개 변수 설정 등)은 고통 스럽습니다. 솔루션을 사용하면 이러한 복잡성을 처리 할 빌더가 있습니다.
— Przemek Nowak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.