[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4965?page=c...
]
Steve Ebersole commented on HHH-4965:
-------------------------------------
Alright, so basically the solution was a form of "remove the first if branch of
QueryImpl#extractParameterInfo inside the for loop". Rather than removing it we know
explicitly check whether to do the "redefinition". So:
{code}
Class javaType = namedParameterTypeRedefinition.get( name );
if ( javaType != null ) {
descriptor.resetExpectedType( TypeFactory.heuristicType( javaType.getName() ) );
}
{code}
becomes
{code}
Class javaType = namedParameterTypeRedefinition.get( name );
if ( javaType != null && mightNeedRedefinition( javaType ) ) {
descriptor.resetExpectedType( TypeFactory.heuristicType( javaType.getName() ) );
}
{code}
where
{code}
private boolean mightNeedRedefinition(Class javaType) {
// for now, only really no for dates/times/timestamps
return java.util.Date.class.isAssignableFrom( javaType );
}
{code}
That fixes the test here and causes no regressions.
Implicit parameters abusively use TypeFactory.heuristicType losing
UserType and XToOneType info
-----------------------------------------------------------------------------------------------
Key: HHH-4965
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4965
Project: Hibernate Core
Issue Type: Bug
Components: entity-manager
Affects Versions: 3.5.0-CR-1
Reporter: jean-claude cote
Assignee: Steve Ebersole
Fix For: 3.5.x
Attachments: HHH-4965-unit-test.diff
Emmanuel
There seems to be a bug in the QueryImpl class in the method
extractParameterInfo()
Here's what I've done:
I create an equal predicate using a Path to House.address and a Address value.
@Entity
class House
{
@Type(type="jc.AddressUserType")
@Columns(columns={@Column(name="address")})
Address address;
In the extractParameterInfo() method there is a loop that gets the
javaType from a namedParameterTypeRedefinition.
It gets the javaType (Address.class) then since it is not null tries
to find the hibernate Type using the TypeFactory.heuristicType()
method. But given a javaType this will only work for strings, int,
double etc. What is passed in is an Address not an AddressUserType.
The huristicType actually returns an hibernate SerializableType and
resets the descriptor which was correct in the first place.
I've fix this for myself my just commenting out the call to
resetExpectedType but there must be a good reason why this call is
made there correct?
Thanks
Jean-Claude
@SuppressWarnings({ "unchecked", "RedundantCast" })
private void extractParameterInfo(Map<String,Class>
namedParameterTypeRedefinition) {
if ( ! AbstractQueryImpl.class.isInstance( query ) ) {
throw new IllegalStateException( "Unknown query type for
parameter
extraction" );
}
HashSet<Parameter<?>> parameters = new
HashSet<Parameter<?>>();
AbstractQueryImpl queryImpl = AbstractQueryImpl.class.cast( query );
// extract named params
for ( String name : (Set<String>)
queryImpl.getParameterMetadata().getNamedParameterNames() ) {
final NamedParameterDescriptor descriptor =
queryImpl.getParameterMetadata().getNamedParameterDescriptor( name );
Class javaType = namedParameterTypeRedefinition.get( name );
if ( javaType != null ) {
descriptor.resetExpectedType(
TypeFactory.heuristicType(
javaType.getName() )
);
}
else if ( descriptor.getExpectedType() != null ) {
javaType =
descriptor.getExpectedType().getReturnedClass();
}
final ParameterImpl parameter = new ParameterImpl( name, javaType
);
parameters.add( parameter );
if ( descriptor.isJpaStyle() ) {
if ( jpaPositionalIndices == null ) {
jpaPositionalIndices = new
HashSet<Integer>();
}
jpaPositionalIndices.add( Integer.valueOf( name ) );
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira