2017-05-08 5 views
0

JDBIでDropwizardを使用しています。ResultSetMapperの引数クラスを取得するJDBI

public interface UserDao 
{ 
    @SqlQuery("select * from users where role = :id") 
    @Mapper(UserMapper.class) 
    String findNameById(@BindBean Role role); 
} 

ユーザー自身がRole種類の属性があります:

class User 
{ 
    private Role role; 

    /* the rest: other attributes, getters, setters, etc. 
} 

役割がrolesと呼ばれる別のテーブルに含まれている私は、ユーザーデータの典型的なDAOを持っています。今度は、Roleをマッパーにマップする必要がありますが、SELECT ...ステートメントを変更してJOIN roles ...部分を追加する必要はありません。私たちは皆、どのようにジョインがクエリーに影響するのかを知っていますし、長期的には可能ならばジョインを避けたいと思います。

私は知っている、そのResultSetMapperのインターフェイスはを渡すmap()メソッドを持っています。

named = {[email protected]} size = 3 
    0 = {[email protected]} "id" -> "1" 
    1 = {[email protected]} "name" -> "TestRole" 
    2 = {[email protected]} "class" -> "class com.example.Role" 

しかしclass com.example.RoleRoleのインスタンスではありません、それはArgumentのインスタンスだと、私はそれに取り組むことができない:そのコンテキストは、私が必要とするすべてのデータをBindingクラスを返すgetBinding()方法があります。

それで、Role引数を取得する方法がありますか、私はそれを見ないか、バインディング引数からデバッグを示すようにインスタンス化する必要がありますか?

+0

ロールで初めて何も行わないで、get roleメソッドを追加してユーザーのロールを設定します。ちなみに、あなたのジョイントにパフォーマンスの問題がある場合は、インデックス問題があると思います –

+0

私はあなたが言うことを理解していません。 getメソッドをどこに追加しますか? –

+0

'Role'がセットされた' User'の 'List'を取得しようとしている場合、または' String'が1つしかない場合は、私は取得できません –

答えて

0

最終的にカスタムバインダーを使用して解決しました。まず、UserDao@BindBeanの代わりに@BindRoleに変更しました。

次に、役割のバインダーを作成する必要がありました。ここでは役割が別の値に手動でバインドされている:

@BindingAnnotation(BindRole.RoleBinderFactory.class) 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.PARAMETER}) 
public @interface BindRole 
{ 
    public static class RoleBinderFactory implements BinderFactory 
    { 
     public Binder build(Annotation annotation) 
     { 
      return new Binder<BindRole, User>() 
      { 
       public void bind(SQLStatement q, BindRole bind, Role role) 
       { 
        q.bind("id", role.getId()); 
        q.bind("name", role.getName()); 
        q.define("role", role); 
       } 
      }; 
     } 
    } 
} 

お知らせdefine()方法は、それがStatementContextに属性を設定するための責任があるので、それを見落とさないようにしてください。

次に、マッパーで、私はちょうどgetArgument()Roleを取得する必要があります。

Role role = new Role(); 
role.setId(1); 
role.setName("TestRole"); 

Role r = (Role) statementContext.getAttribute("role"); 
boolean equals = e.equals(role); 

デバッガequalsではtrueとして示され、その問題が解決されます。ウーホー。

関連する問題