[hibernate-dev] SqlTypeDescriptor bind by name limitation

Vlad Mihalcea mihalcea.vlad at gmail.com
Wed Jun 7 12:44:15 EDT 2017


>
> A CallableStatement is also a PreparedStatement so we already know how to
> bind positionally against both PreparedStatement (and CallableStatement,
> since they are PreparedStatement).  And only for CallableStatement does
> JDBC define additional support for binding by name.


I followed the call stack to this, and I think it's fine since the user has
the choice of using positional binding instead of name-based stored
procedure parameter binding:

if ( this.procedureCall.getParameterStrategy() ==
ParameterStrategy.NAMED && canDoNameParameterBinding() ) {
   ((ProcedureParameterNamedBinder) typeToUse).nullSafeSet(
         statement,
         null,
         this.getName(),
         session()
   );
}

Vlad

On Wed, Jun 7, 2017 at 6:39 PM, Steve Ebersole <steve at hibernate.org> wrote:

> Ignoring some poor wording in the Javadocs by me :)
>
> On Wed, Jun 7, 2017 at 10:38 AM Steve Ebersole <steve at hibernate.org>
> wrote:
>
>> I'm not sure what you mean when you say that SqlTypeDescriptor only
>> supports binding by name.  On both 5.2 and 6.0 I see :
>>
>> /**
>>  * Bind a value to a prepared statement.
>>  *
>>  * @param st The prepared statement to which to bind the value.
>>  * @param value The value to bind.
>>  * @param index The position at which to bind the value within the prepared statement
>>  * @param options The options.
>>  *
>>  * @throws SQLException Indicates a JDBC error occurred.
>>  */
>> public void bind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException;
>>
>> /**
>>  * Bind a value to a CallableStatement.
>>  *
>>  * @param st The prepared statement to which to bind the value.
>>  * @param value The value to bind.
>>  * @param name The name to bind the value within the prepared statement
>>  * @param options The options.
>>  *
>>  * @throws SQLException Indicates a JDBC error occurred.
>>  */
>> public void bind(CallableStatement st, X value, String name, WrapperOptions options) throws SQLException;
>>
>>
>>
>> Which is what you'd expect.  I'm not really following what you are
>> saying.  A CallableStatement is also a PreparedStatement so we already know
>> how to bind positionally against both PreparedStatement (and
>> CallableStatement, since they are PreparedStatement).  And only for
>> CallableStatement does JDBC define additional support for binding by name.
>>
>> And 6.0 is going to bind by position, but that's what all other versions
>> of Hibernate have done.  The change in 6.0 you are thinking about is
>> *reading* values back (from ResultSets, CallableStatement params, etc).
>>
>> On Wed, Jun 7, 2017 at 9:13 AM Vlad Mihalcea <mihalcea.vlad at gmail.com>
>> wrote:
>>
>>> Hi,
>>>
>>> While writing an example for a custom Hibernate Type which supports
>>> PostgreSQL arrays,
>>> I realized that the SqlTypeDescriptor only supports bind by name:
>>>
>>> @Override
>>> protected void doBind(CallableStatement st, X value, String name,
>>> WrapperOptions options)
>>>         throws SQLException {
>>> }
>>>
>>> However, for the java.sql.Array, we only have a bind by index method in
>>> java.sql.Statement:
>>>
>>> void setArray (int parameterIndex, Array x) throws SQLException;
>>>
>>> I remember that 6.0 is going to bind by index, so maybe this issue is
>>> already taken care of in the new version.
>>> Should we provide some fix for 5.x as well?
>>>
>>> Vlad
>>> _______________________________________________
>>> hibernate-dev mailing list
>>> hibernate-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>>>
>>


More information about the hibernate-dev mailing list