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

QuerydsljOOQ 는 두 가지 인기있는 선택입니다.


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.