use of org.jdbi.v3.sqlobject.customizer.Bind in project jdbi by jdbi.
the class SqlStatement method bindBeanList.
/**
* Bind a parameter for each value in the given list * number of property names,
* and defines an attribute as the comma-separated list of parameter references (using colon prefix).
*
* Used to create query similar to:
* select * from things where (id, foo) in ((1,'abc'),(2,'def'),(3,'ghi'))
* <p>
* Examples:
* <pre>
*
* List<ThingKey> thingKeys = ...
* List<Thing> things = handle.createQuery("select * from things where (id, foo) in (<thingKeys>)")
* .bindBeanList("thingKeys", thingKeys, Arrays.asList("id", "foo"))
* .mapTo(Contact.class)
* .list();
* </pre>
*
* @param key attribute name
* @param values list of values that will be comma-spliced into the defined attribute value.
* @param propertyNames list of properties that will be invoked on the values.
* @return this
* @throws IllegalArgumentException if the list of values or properties is empty.
* @throws UnableToCreateStatementException If a property can't be found on an value or we can't find a Argument for it.
*/
public final This bindBeanList(String key, List<?> values, List<String> propertyNames) throws UnableToCreateStatementException {
if (values.isEmpty()) {
throw new IllegalArgumentException(getClass().getSimpleName() + ".bindBeanList was called with no values.");
}
if (propertyNames.isEmpty()) {
throw new IllegalArgumentException(getClass().getSimpleName() + ".bindBeanList was called with no properties.");
}
StringBuilder names = new StringBuilder();
StatementContext ctx = getContext();
for (int valueIndex = 0; valueIndex < values.size(); valueIndex++) {
if (valueIndex > 0) {
names.append(',');
}
Object bean = values.get(valueIndex);
BeanPropertyArguments beanProperties = new BeanPropertyArguments(null, bean);
names.append("(");
for (int propertyIndex = 0; propertyIndex < propertyNames.size(); propertyIndex++) {
if (propertyIndex > 0) {
names.append(",");
}
String propertyName = propertyNames.get(propertyIndex);
String name = "__" + key + "_" + valueIndex + "_" + propertyName;
names.append(':').append(name);
Argument argument = beanProperties.find(propertyName, ctx).orElseThrow(() -> new UnableToCreateStatementException("Unable to get " + propertyName + " argument for " + bean, ctx));
bind(name, argument);
}
names.append(")");
}
return define(key, names.toString());
}
use of org.jdbi.v3.sqlobject.customizer.Bind in project jdbi by jdbi.
the class TestArgumentFactory method testOnPreparedBatch.
@Test
public void testOnPreparedBatch() throws Exception {
Handle h = dbRule.getSharedHandle();
PreparedBatch batch = h.prepareBatch("insert into something (id, name) values (:id, :name)");
batch.registerArgument(new NameAF());
batch.bind("id", 1).bind("name", new Name("Brian", "McCallister")).add();
batch.bind("id", 2).bind("name", new Name("Henning", "S")).add();
batch.execute();
List<String> rs = h.createQuery("select name from something order by id").mapTo(String.class).list();
assertThat(rs.get(0)).isEqualTo("Brian McCallister");
assertThat(rs.get(1)).isEqualTo("Henning S");
}
use of org.jdbi.v3.sqlobject.customizer.Bind in project jdbi by jdbi.
the class TestVavrValueArgumentFactoryWithDB method testGetValidationValid_shouldReturnCorrectRow.
@Test
public void testGetValidationValid_shouldReturnCorrectRow() {
Something result = dbRule.getSharedHandle().createQuery(SELECT_BY_NAME).bind("name", Validation.valid("brian")).mapToBean(Something.class).findOnly();
assertThat(result).isEqualTo(BRIAN_SOMETHING);
}
use of org.jdbi.v3.sqlobject.customizer.Bind in project jdbi by jdbi.
the class TestDocumentation method testFiveMinuteFluentApi.
@Test
public void testFiveMinuteFluentApi() throws Exception {
try (Handle h = dbRule.openHandle()) {
h.execute("insert into something (id, name) values (?, ?)", 1, "Brian");
String name = h.createQuery("select name from something where id = :id").bind("id", 1).mapTo(String.class).findOnly();
assertThat(name).isEqualTo("Brian");
}
}
use of org.jdbi.v3.sqlobject.customizer.Bind in project jdbi by jdbi.
the class BindJpaFactory method createForParameter.
@Override
public SqlStatementParameterCustomizer createForParameter(Annotation annotation, Class<?> sqlObjectType, Method method, Parameter param, int index, Type type) {
BindJpa bind = (BindJpa) annotation;
final String prefix;
if (bind.value().isEmpty()) {
prefix = "";
} else {
prefix = bind.value() + ".";
}
return (stmt, arg) -> {
JpaClass<?> jpaClass = JpaClass.get(arg.getClass());
for (JpaMember member : jpaClass.members()) {
stmt.bindByType(prefix + member.getColumnName(), readMember(arg, member), member.getType());
}
};
}
Aggregations