복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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

  5. from https://stackoverflow.com/questions/19424573/how-to-do-in-query-in-jdbi by cc-by-sa and MIT license