@Bind peut-il être utilisé avec des énumérations et d’autres types arbitraires utilisant JDBI?

JDBI prend-il en charge la liaison des types enum via des annotations?

Par exemple, en supposant qu’un DAO incluant une méthode:

@SqlQuery("select count(*) from answer a where a.foo = :foo") Long someSqlQuery(@Bind("foo") Foo foo); 

Et, foo égal à Foo.BAR , pourrais-je espérer une requête:

 select count(*) from answer a where a.foo = 'BAR' 

Si tel est le cas, toSsortingng() utilisé pour déterminer ce qui est substitué?

En outre, JDBI permet-il d’utiliser @Bind avec n’importe quel type qui étend Object ? Et encore une fois, si toSsortingng() utilisé?

Selon le code source, Enum.name() est utilisé, pas toSsortingng()

Si un object est lié, jdbi utilise setObject(Object object) du pilote jdbc que vous utilisez. Dans mon expérience de PostgreSQL par exemple, il lie avec succès les Map de hstore à hstore et les tableaux à les tableaux de postgreSQL, car c’est ce que fait le pilote jdbc de PostgreSQL.

Si vous souhaitez gérer un type d’object spécifique d’une manière spécifique, vous pouvez implémenter les ArgumentFactory (pour lesquels il ne semble pas exister de documentation mais un exemple ici dans Stack Overflow ) ou les arguments BinderFactory (que je viens de découvrir maintenant).

Pour répondre à votre question sur les “types arbitraires”, vous pouvez implémenter une BinderFactory afin de la lier à tout ce que vous voulez.

 @BindingAnnotation(UserBinder.UserBinderFactory.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER}) public @interface UserBinder { public static class UserBinderFactory implements BinderFactory { @Override public Binder build(Annotation annotation) { return new Binder() { @Override public void bind(SQLStatement q, UserBinder bind, User arg) { q.bind("userId", arg.getUserId()); q.bind("uuid", arg.getUuid()); q.bind("openId", arg.getOpenId()); q.bind("givenName", arg.getGivenName()); // etc. } }; } } } 

Cela s’avère particulièrement utile si vous souhaitez stocker les types complexes de manière particulière, par exemple des données binarys ou des collections que vous souhaitez convertir en fichiers CSV ou uniquement dans des tables de mappage distinctes. Ensuite, vous utilisez votre nouveau classeur fantaisie comme suit:

 @SqlUpdate( "INSERT INTO user (openId,givenName,uuid," + // etc. ") VALUES (:openId,:givenName,:uuid" + // etc. ")" ) public abstract int createUser( @UserBinder User user ); 

Vous pouvez également utiliser une annotation @BindBean , qui recherchera automatiquement les champs d’un object en fonction du nom du paramètre bind (par exemple, il peut mapper un espace réservé de requête ":userId" à la méthode getUserId() ).