@Override
 public String bindMany(Object value, QueryContext context) {
   List<String> keys;
   CommandParameters params = context.getParameters();
   if (value instanceof Iterable) {
     keys = addParameters((Iterable) value, params);
   } else {
     Object[] arr = asObjectArray(value);
     if (arr != null) {
       keys = addParameters(Arrays.asList(arr), params);
     } else {
       keys = addParameters(Arrays.asList(value), params);
     }
   }
   return joiner.join(keys).toString();
 }
/** @author enlo */
@Data
public class NamedParameterBinder implements ParameterBinder {

  private static final StringJoiner joiner = StringJoiner.valueOf(", ");
  private static final long serialVersionUID = 1L;

  private String prefix;

  public NamedParameterBinder(String prefix) {
    this.prefix = prefix;
  }

  @Override
  public String bind(Object value, QueryContext context) {
    return context.getParameters().addValueWithPrefix(prefix, value);
  }

  @Override
  public String bindMany(Object value, QueryContext context) {
    List<String> keys;
    CommandParameters params = context.getParameters();
    if (value instanceof Iterable) {
      keys = addParameters((Iterable) value, params);
    } else {
      Object[] arr = asObjectArray(value);
      if (arr != null) {
        keys = addParameters(Arrays.asList(arr), params);
      } else {
        keys = addParameters(Arrays.asList(value), params);
      }
    }
    return joiner.join(keys).toString();
  }

  public List<String> addParameters(Iterable<?> items, CommandParameters params) {
    List<String> keys = new ArrayList<>();
    for (Object item : items) {
      String key = params.addValueWithPrefix(prefix, item);
      keys.add(key);
    }
    return keys;
  }
}