Test and fix for HHH-11140

This commit is contained in:
Christian Beikov 2016-09-29 16:00:33 +02:00 committed by Steve Ebersole
parent f34508e3f3
commit b6aa191720
4 changed files with 101 additions and 1 deletions

View File

@ -455,6 +455,19 @@ public class FromElement extends HqlSqlWalkerNode implements DisplayableNode, Pa
return origin;
}
public FromElement getFetchOrigin() {
if ( origin == null ) {
return null;
}
if ( !origin.isFetch() ) {
return origin;
}
if ( origin.getText() == null || "".equals( origin.getText() ) ) {
return origin.getFetchOrigin();
}
return origin;
}
public static final String DISCRIMINATOR_PROPERTY_NAME = "class";
private TypeDiscriminatorMetadata typeDiscriminatorMetadata;

View File

@ -207,7 +207,9 @@ public class SelectClause extends SelectExpressionList {
else {
origin = fromElement.getRealOrigin();
}
if ( !fromElementsForLoad.contains( origin ) ) {
if ( !fromElementsForLoad.contains( origin )
// work around that fetch joins of element collections where their parent instead of the root is selected
&& ( !fromElement.isCollectionJoin() || !fromElementsForLoad.contains( fromElement.getFetchOrigin() ) ) ) {
throw new QueryException(
"query specified join fetching, but the owner " +
"of the fetched association was not present in the select list " +

View File

@ -0,0 +1,40 @@
package org.hibernate.test.collection.map;
import javax.persistence.*;
@Entity
@Table(name = "multilingual_parent")
public class MultilingualStringParent {
@Id
@GeneratedValue
private long id;
@ManyToOne(fetch = FetchType.LAZY)
private MultilingualStringParent parent;
@ManyToOne(fetch = FetchType.LAZY)
private MultilingualString string;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public MultilingualStringParent getParent() {
return parent;
}
public void setParent(MultilingualStringParent parent) {
this.parent = parent;
}
public MultilingualString getString() {
return string;
}
public void setString(MultilingualString string) {
this.string = string;
}
}

View File

@ -53,6 +53,7 @@ public class PersistentMapTest extends BaseCoreFunctionalTestCase {
User.class,
UserData.class,
MultilingualString.class,
MultilingualStringParent.class,
Address.class,
Detail.class
};
@ -238,6 +239,50 @@ public class PersistentMapTest extends BaseCoreFunctionalTestCase {
s.close();
}
@Test
@TestForIssue( jiraKey = "HQLPARSER-15")
public void testJoinFetchElementCollectionWithParentSelect() {
Session s = openSession();
s.getTransaction().begin();
MultilingualString m = new MultilingualString();
LocalizedString localizedString = new LocalizedString();
localizedString.setLanguage( "English" );
localizedString.setText( "name" );
m.getMap().put( localizedString.getLanguage(), localizedString );
localizedString = new LocalizedString();
localizedString.setLanguage( "English Pig Latin" );
localizedString.setText( "amenay" );
m.getMap().put( localizedString.getLanguage(), localizedString );
MultilingualStringParent parent = new MultilingualStringParent();
parent.setString( m );
s.persist( m );
s.persist( parent );
s.getTransaction().commit();
s.close();
s = openSession();
s.beginTransaction();
m = s.createQuery(
"SELECT s FROM MultilingualStringParent parent " +
"JOIN parent.string s " +
"JOIN FETCH s.map", MultilingualString.class )
.getSingleResult();
assertEquals( 2, m.getMap().size() );
localizedString = m.getMap().get( "English" );
assertEquals( "English", localizedString.getLanguage() );
assertEquals( "name", localizedString.getText() );
localizedString = m.getMap().get( "English Pig Latin" );
assertEquals( "English Pig Latin", localizedString.getLanguage() );
assertEquals( "amenay", localizedString.getText() );
s.delete( parent );
s.delete( m );
s.getTransaction().commit();
s.close();
}
@Test
@TestForIssue( jiraKey = "HHH-11038" )
public void testMapKeyColumnNonInsertableNonUpdatableBidirOneToMany() {