public final This bindBeanList(String key, List<?> values, List<String> propertyNames) {
        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, getConfig());

            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());
    }
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&lt;ThingKey&gt; thingKeys = ...
List&lt;Thing&gt; things = handle.createQuery("select * from things where (id, foo) in (&lt;thingKeys&gt;)")
    .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.
@see #bindList(BiConsumer, String, List)
core/src/main/java/org/jdbi/v3/core/statement/SqlStatement.java