Skip to content

Commit d0d0963

Browse files
committed
HHH-2851 : ParameterTranslationsImpl fails to correctly determine parameter type
1 parent 1ec7688 commit d0d0963

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

hibernate-core/src/main/java/org/hibernate/hql/internal/ast/ParameterTranslationsImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ else if ( NamedParameterSpecification.class.isInstance( spec ) ) {
108108
paramHolder.type = namedSpec.getExpectedType();
109109
namedParameterMap.put( namedSpec.getName(), paramHolder );
110110
}
111+
else if ( paramHolder.type == null && namedSpec.getExpectedType() != null ) {
112+
// previous reference to the named parameter did not have type determined;
113+
// this time, it can be determined by namedSpec.getExpectedType().
114+
paramHolder.type = namedSpec.getExpectedType();
115+
}
111116
paramHolder.positions.add( i );
112117
}
113118
// don't care about other param types here, just those explicitly user-defined...

hibernate-core/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,86 @@ public void testEmptyInList() {
644644
session.close();
645645
}
646646

647+
@Test
648+
@TestForIssue( jiraKey = "HHH-2851")
649+
public void testMultipleRefsToSameParam() {
650+
Session s = openSession();
651+
s.beginTransaction();
652+
Human h = new Human();
653+
h.setName( new Name( "Johnny", 'B', "Goode" ) );
654+
s.save( h );
655+
h = new Human();
656+
h.setName( new Name( "Steve", null, "Ebersole" ) );
657+
s.save( h );
658+
h = new Human();
659+
h.setName( new Name( "Bono", null, null ) );
660+
s.save( h );
661+
h = new Human();
662+
h.setName( new Name( "Steve", 'Z', "Johnny" ) );
663+
h.setIntValue( 1 );
664+
s.save( h );
665+
h = new Human();
666+
h.setName( new Name( null, null, null ) );
667+
s.save( h );
668+
s.getTransaction().commit();
669+
s.close();
670+
671+
s = openSession();
672+
s.beginTransaction();
673+
List results = s.createQuery( "from Human where name.first = :name or name.last=:name" )
674+
.setParameter( "name", "Johnny" )
675+
.list();
676+
assertEquals( 2, results.size() );
677+
678+
results = s.createQuery( "from Human where name.last = :name or :name is null" )
679+
.setParameter( "name", "Goode" )
680+
.list();
681+
assertEquals( 1, results.size() );
682+
results = s.createQuery( "from Human where :name is null or name.last = :name" )
683+
.setParameter( "name", "Goode" )
684+
.list();
685+
assertEquals( 1, results.size() );
686+
687+
results = s.createQuery( "from Human where name.first = :firstName and (name.last = :name or :name is null)" )
688+
.setParameter( "firstName", "Bono" )
689+
.setParameter( "name", null )
690+
.list();
691+
assertEquals( 1, results.size() );
692+
results = s.createQuery( "from Human where name.first = :firstName and ( :name is null or name.last = :name )" )
693+
.setParameter( "firstName", "Bono" )
694+
.setParameter( "name", null )
695+
.list();
696+
assertEquals( 1, results.size() );
697+
698+
results = s.createQuery( "from Human where intValue = :intVal or :intVal is null" )
699+
.setParameter( "intVal", 1 )
700+
.list();
701+
assertEquals( 1, results.size() );
702+
results = s.createQuery( "from Human where :intVal is null or intValue = :intVal" )
703+
.setParameter( "intVal", 1 )
704+
.list();
705+
assertEquals( 1, results.size() );
706+
707+
708+
results = s.createQuery( "from Human where intValue = :intVal or :intVal is null" )
709+
.setParameter( "intVal", null )
710+
.list();
711+
assertEquals( 5, results.size() );
712+
results = s.createQuery( "from Human where :intVal is null or intValue = :intVal" )
713+
.setParameter( "intVal", null )
714+
.list();
715+
assertEquals( 5, results.size() );
716+
717+
s.getTransaction().commit();
718+
s.close();
719+
720+
s = openSession();
721+
s.beginTransaction();
722+
s.createQuery( "delete Human" ).executeUpdate();
723+
s.getTransaction().commit();
724+
s.close();
725+
}
726+
647727
@Test
648728
public void testComponentNullnessChecks() {
649729
Session s = openSession();

0 commit comments

Comments
 (0)