Skip to content

Commit

Permalink
HHH-10664 - Prep 6.0 feature branch - merge hibernate-entitymanager i…
Browse files Browse the repository at this point in the history
…nto hibernate-core (fix test failures)
  • Loading branch information
sebersole committed May 6, 2016
1 parent 66802a7 commit 5a328d1
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 29 deletions.
Expand Up @@ -62,6 +62,7 @@
import org.hibernate.query.QueryParameter;
import org.hibernate.query.spi.QueryImplementor;
import org.hibernate.query.spi.QueryParameterBinding;
import org.hibernate.query.spi.QueryParameterListBinding;
import org.hibernate.transform.ResultTransformer;
import org.hibernate.type.Type;

Expand Down Expand Up @@ -293,36 +294,74 @@ public String[] getNamedParameters() {
@Override
@SuppressWarnings("unchecked")
public <P> QueryImplementor setParameter(QueryParameter<P> parameter, P value) {
queryParameterBindings.getBinding( parameter ).setBindValue( value );
locateBinding( parameter ).setBindValue( value );
return this;
}

@SuppressWarnings("unchecked")
private <P> QueryParameterBinding<P> locateBinding(Parameter<P> parameter) {
if ( parameter instanceof QueryParameter ) {
return queryParameterBindings.getBinding( (QueryParameter) parameter );
}
else if ( parameter.getName() != null ) {
return queryParameterBindings.getBinding( parameter.getName() );
}
else if ( parameter.getPosition() != null ) {
return queryParameterBindings.getBinding( parameter.getPosition() );
}

throw getExceptionConverter().convert(
new IllegalArgumentException( "Could not resolve binding for given parameter reference [" + parameter + "]" )
);
}

private <P> QueryParameterBinding<P> locateBinding(QueryParameter<P> parameter) {
return queryParameterBindings.getBinding( parameter );
}

@Override
@SuppressWarnings("unchecked")
public <P> QueryImplementor setParameter(Parameter<P> parameter, P value) {
if ( value instanceof TypedParameterValue ) {
final TypedParameterValue typedValueWrapper = (TypedParameterValue ) value;
setParameter( (QueryParameter) parameter, typedValueWrapper.getValue(), typedValueWrapper.getType() );
setParameter( parameter, ( (TypedParameterValue) value ).getValue(), ( (TypedParameterValue) value ).getType() );
}
else if ( value instanceof Collection ) {
setParameterList( (QueryParameter) parameter, (Collection) value );
locateListBinding( parameter ).setBindValues( (Collection) value );
}
else if ( parameter instanceof QueryParameter ) {
queryParameterBindings.getBinding( (QueryParameter) parameter ).setBindValue( value );
else {
locateBinding( parameter ).setBindValue( value );
}
else if ( parameter.getName() != null ) {
queryParameterBindings.getBinding( parameter.getName() ).setBindValue( value );

return this;
}

@SuppressWarnings("unchecked")
private <P> void setParameter(Parameter<P> parameter, Object value, Type type) {
if ( parameter instanceof QueryParameter ) {
setParameter( (QueryParameter) parameter, value, type );
}
else if ( parameter.getPosition() != null ) {
queryParameterBindings.getBinding( parameter.getPosition() ).setBindValue( value );
else if ( value == null ) {
locateBinding( parameter ).setBindValue( null, type );
}
else if ( value instanceof Collection ) {
locateListBinding( parameter ).setBindValues( (Collection) value, type );
}
else {
throw getExceptionConverter().convert(
new IllegalArgumentException( "Could not resolve parameter instance [" + parameter + "] as query parameter" )
locateBinding( parameter ).setBindValue( (P) value, type );
}
}

);
private QueryParameterListBinding locateListBinding(Parameter parameter) {
if ( parameter instanceof QueryParameter ) {
return queryParameterBindings.getQueryParameterListBinding( (QueryParameter) parameter );
}
else {
return queryParameterBindings.getQueryParameterListBinding( parameter.getName() );
}
return this;
}

private QueryParameterListBinding locateListBinding(String name) {
return queryParameterBindings.getQueryParameterListBinding( name );
}

@Override
Expand All @@ -345,7 +384,16 @@ else if ( value instanceof Collection ) {
@Override
@SuppressWarnings("unchecked")
public QueryImplementor setParameter(int position, Object value) {
queryParameterBindings.getBinding( position ).setBindValue( value );
if ( value instanceof TypedParameterValue ) {
final TypedParameterValue typedParameterValue = (TypedParameterValue) value;
setParameter( position, typedParameterValue.getValue(), typedParameterValue.getType() );
}
if ( value instanceof Collection ) {
setParameterList( Integer.toString( position ), (Collection) value );
}
else {
queryParameterBindings.getBinding( position ).setBindValue( value );
}
return this;
}

Expand Down Expand Up @@ -494,9 +542,20 @@ public <T> Parameter<T> getParameter(String name, Class<T> type) {

@Override
public Parameter<?> getParameter(int position) {
// It is important to understand that there are 2 completely distinct conceptualization of
// "positional parameters" in play here:
// 1) The legacy Hibernate concept is akin to JDBC PreparedStatement parameters. Very limited and
// deprecated since 5.x. These are numbered starting from 0 and kept in the
// ParameterMetadata positional-parameter array keyed by this zero-based position
// 2) JPA's definition is really just a named parameter, but expected to explicitly be
// sequential intergers starting from 0 (ZERO); they can repeat.
//
// It is considered illegal to mix positional-parameter with named parameters of any kind. So therefore.
// if ParameterMetadata reports that it has any positional-parameters it is talking about the
// legacy Hibernate concept.
// lookup jpa-based positional parameters first by name.
if ( parameterMetadata.getPositionalParameterCount() == 0 ) {
return parameterMetadata.getQueryParameter( String.valueOf( position ) );
return parameterMetadata.getQueryParameter( Integer.toString( position ) );
}
// fallback to oridinal lookup
return parameterMetadata.getQueryParameter( position );
Expand Down
Expand Up @@ -116,13 +116,13 @@ public int getOrdinalParameterCount() {
* @throws QueryParameterException If the position is out of range
*/
public OrdinalParameterDescriptor getOrdinalParameterDescriptor(int position) {
if ( position < 1 || position > ordinalDescriptors.length ) {
if ( position < 0 || position >= ordinalDescriptors.length ) {
throw new QueryParameterException(
"Position beyond number of declared ordinal parameters. " +
"Remember that ordinal parameters are 1-based! Position: " + position
);
}
return ordinalDescriptors[position - 1];
return ordinalDescriptors[position];
}

/**
Expand Down
Expand Up @@ -56,7 +56,9 @@ public void setBindValue(T value) {
@Override
public void setBindValue(T value, Type clarifiedType) {
setBindValue( value );
this.bindType = clarifiedType;
if ( clarifiedType != null ) {
this.bindType = clarifiedType;
}
}

@Override
Expand Down
Expand Up @@ -199,17 +199,17 @@ public QueryParameterBinding getBinding(String name) {
public QueryParameterBinding getBinding(int position) {
QueryParameterBinding binding = null;
if ( parameterMetadata != null ) {
if ( parameterMetadata.getPositionalParameterCount() == 0 ) {
if ( ! parameterMetadata.hasPositionalParameters() ) {
// no positional parameters, assume jpa named.
binding = locateBinding( String.valueOf( position ) );
binding = locateBinding( Integer.toString( position ) );
}
else {
try {
if ( position < positionalParameterBindings.size() ) {
binding = positionalParameterBindings.get( position );
if ( binding == null ) {
// metadata parameters are 1-based
binding = makeBinding( parameterMetadata.getQueryParameter( position + 1 ) );
binding = makeBinding( parameterMetadata.getQueryParameter( position ) );
positionalParameterBindings.set( position, binding );
}
}
Expand All @@ -218,7 +218,7 @@ public QueryParameterBinding getBinding(int position) {
positionalParameterBindings.add( null );
}
// metadata parameters are 1-based
QueryParameter queryParameter = parameterMetadata.getQueryParameter( position + 1 );
QueryParameter queryParameter = parameterMetadata.getQueryParameter( position );
binding = makeBinding( queryParameter );
positionalParameterBindings.add( binding );
}
Expand All @@ -228,9 +228,11 @@ public QueryParameterBinding getBinding(int position) {
}
}
}

if ( binding == null ) {
throw new IllegalArgumentException( "Unknown parameter position: " + position );
}

return binding;
}

Expand Down
Expand Up @@ -21,9 +21,7 @@
import javax.persistence.TemporalType;
import javax.persistence.Tuple;

import junit.framework.Assert;
import org.hibernate.Hibernate;
import org.hibernate.QueryParameterException;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.Oracle8iDialect;
import org.hibernate.dialect.PostgreSQL9Dialect;
Expand All @@ -34,10 +32,12 @@
import org.hibernate.jpa.test.Item;
import org.hibernate.jpa.test.Wallet;
import org.hibernate.stat.Statistics;

import org.hibernate.testing.SkipForDialect;
import org.hibernate.testing.SkipForDialects;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
import junit.framework.Assert;

import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
Expand Down Expand Up @@ -146,7 +146,7 @@ public String getName() {
}
@Override
public Integer getPosition() {
return 1;
return 0;
}
@Override
public Class getParameterType() {
Expand Down Expand Up @@ -184,7 +184,7 @@ public String getName() {
}
@Override
public Integer getPosition() {
return 1;
return 0;
}
@Override
public Class getParameterType() {
Expand Down Expand Up @@ -354,7 +354,7 @@ public String getName() {
}
@Override
public Integer getPosition() {
return 1;
return 0;
}
@Override
public Class getParameterType() {
Expand Down Expand Up @@ -846,7 +846,7 @@ public void testPositionalParameterWithUserError() throws Exception {
hqlQuery.setParameter( 2, "Expensive" );
fail( "Should fail due to a user error in parameters" );
}
catch( QueryParameterException e ) {
catch( IllegalArgumentException e ) {
// success expected
e.printStackTrace();
}
Expand Down

0 comments on commit 5a328d1

Please sign in to comment.