[SQL] 어떻게 jDBI에서의 쿼리 할까?
SQL어떻게 jDBI에서의 쿼리 할까?
어떻게 jDBI이 같은 일도 수행 할 수 있습니까?
@SqlQuery("select id from foo where name in <list of names here>")
List<Integer> getIds(@Bind("nameList") List<String> nameList);
테이블 : foo는 (아이디 INT, 이름 varchar)
MyBatis로에서 @SelectProvider 유사합니다.
내가 JDBI의 SQL 오브젝트 API를 사용하여 런타임에 동적 SQL 쿼리를 만들려면 어떻게해야합니까 비슷한 질문도있다?하지만 어떻게 든 대답은 나에게 분명하지 않다.
해결법
-
==============================
1.이 작업을해야합니다 :
이 작업을해야합니다 :
@SqlQuery("select id from foo where name in (<nameList>)") List<Integer> getIds(@BindIn("nameList") List<String> nameList);
이 방법을 포함하는 주석 클래스에 잊지 마세요 :
@UseStringTemplate3StatementLocator
주석 (후드 JDBI에서 beacuse는 대체 할 아파치 StringTemplate 사용). 또한 (가 StringTemplate 사용하는 특별한 상징 beacause를)이 주석으로, 당신은 탈출하지 않고 SQL 쿼리에서 '<'문자를 사용할 수 있습니다.
-
==============================
2.jDBI에서 빌드 동적 쿼리에 사용 @Define 주석. 예:
jDBI에서 빌드 동적 쿼리에 사용 @Define 주석. 예:
@SqlUpdate("insert into <table> (id, name) values (:id, :name)") public void insert(@Define("table") String table, @BindBean Something s); @SqlQuery("select id, name from <table> where id = :id") public Something findById(@Define("table") String table, @Bind("id") Long id);
-
==============================
3.PostgreSQL을 통해, 나는 이것을 달성하기 위해 배열에 어떤 비교 및 바인딩 컬렉션을 사용할 수 있었다.
PostgreSQL을 통해, 나는 이것을 달성하기 위해 배열에 어떤 비교 및 바인딩 컬렉션을 사용할 수 있었다.
public interface Foo { @SqlQuery("SELECT id FROM foo WHERE name = ANY (:nameList)") List<Integer> getIds(@BindStringList("nameList") List<String> nameList); } @BindingAnnotation(BindStringList.BindFactory.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER}) public @interface BindStringList { String value() default "it"; class BindFactory implements BinderFactory { @Override public Binder build(Annotation annotation) { return new Binder<BindStringList, Collection<String>>() { @Override public void bind(SQLStatement<?> q, BindStringList bind, Collection<String> arg) { try { Array array = q.getContext().getConnection().createArrayOf("varchar", arg.toArray()); q.bindBySqlType(bind.value(), array, Types.ARRAY); } catch (SQLException e) { // handle error } } }; } } }
주의 :이 PostgreSQL을에 하드 종속성을 생성하므로, 어떠한의 ANSI SQL 표준의 일부가 아닙니다.
-
==============================
4.당신이 JDBI 3 유창함 API를 사용하는 경우, 당신은 속성 bindList ()를 사용할 수 있습니다 :
당신이 JDBI 3 유창함 API를 사용하는 경우, 당신은 속성 bindList ()를 사용할 수 있습니다 :
List<String> keys = new ArrayList<String>() keys.add("user_name"); keys.add("street"); handle.createQuery("SELECT value FROM items WHERE kind in (<listOfKinds>)") .bindList("listOfKinds", keys) .mapTo(String.class) .list(); // Or, using the 'vararg' definition handle.createQuery("SELECT value FROM items WHERE kind in (<varargListOfKinds>)") .bindList("varargListOfKinds", "user_name", "docs", "street", "library") .mapTo(String.class) .list();
참고 어떻게 쿼리 문자열 사용
대신 일반 : listOfKinds. 문서는 여기에 있습니다 : http://jdbi.org/#_binding_arguments
from https://stackoverflow.com/questions/19424573/how-to-do-in-query-in-jdbi by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 하지 존재하는 경우 열을 추가 MYSQL (0) | 2020.07.02 |
---|---|
[SQL] SQL Server 2008의 복합 외래 키 만들기 (0) | 2020.07.02 |
[SQL] 어떻게 T-SQL에서 제로 패딩 문자열로 int를 변환합니까? (0) | 2020.07.02 |
[SQL] ROW_NUMBER에 필요한 동적 피벗 () (0) | 2020.07.02 |
[SQL] 계획을 설명 MySQL의에서 "멀리 최적화 된 선택 테이블"의 의미 (0) | 2020.07.02 |