Skip to content

Commit a9b955e

Browse files
committed
HHH-18871 prevent adding duplicate path names while determining navigable path
1 parent e0f889d commit a9b955e

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

hibernate-core/src/main/java/org/hibernate/query/sql/internal/ResultSetMappingProcessor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,11 @@ else if ( ownerResult instanceof DynamicFetchBuilderLegacy dynamicFetchBuilderLe
270270
else {
271271
throw new AssertionFailure( "Unexpected fetch builder" );
272272
}
273-
return path.append( fetchBuilder.getFetchable().getFetchableName() );
273+
final String fetchableName = fetchBuilder.getFetchable().getFetchableName();
274+
if ( path.getLocalName().equals( fetchableName ) ) {
275+
return path;
276+
}
277+
return path.append( fetchableName );
274278
}
275279

276280
private DynamicResultBuilderEntityStandard createSuffixedResultBuilder(
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.query;
6+
7+
import jakarta.persistence.*;
8+
import org.hibernate.cfg.AvailableSettings;
9+
import org.hibernate.testing.orm.junit.*;
10+
import org.junit.jupiter.api.Test;
11+
12+
import java.util.HashSet;
13+
import java.util.Set;
14+
15+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
16+
17+
/**
18+
* This reproduces an issue in Hibernate 6 parsing native queries.
19+
*/
20+
@DomainModel(
21+
annotatedClasses = {
22+
NativeQueryNestedTree.TreeNode.class
23+
}
24+
)
25+
@ServiceRegistry(
26+
settings = {
27+
@Setting(name = AvailableSettings.SHOW_SQL, value = "true"),
28+
@Setting(name = AvailableSettings.HBM2DDL_AUTO, value = "create")
29+
}
30+
)
31+
@SessionFactory
32+
@JiraKey(value = "HHH-18871")
33+
public class NativeQueryNestedTree {
34+
35+
@Test
36+
public void test(SessionFactoryScope scope) {
37+
// We want to make sure 'Could not locate TableGroup' no longer is thrown
38+
assertDoesNotThrow( () ->
39+
scope.inTransaction( session ->
40+
session.createNativeQuery( """
41+
SELECT {t.*}, {t2.*}, {t3.*}
42+
FROM TREE t
43+
INNER JOIN tree t2 ON t2.parentident = t.ident
44+
INNER JOIN tree t3 ON t3.parentident = t2.ident
45+
""" )
46+
.addEntity( "t", TreeNode.class )
47+
.addJoin( "t2", "t.children" )
48+
.addJoin( "t3", "t2.children" )
49+
.list()
50+
)
51+
);
52+
}
53+
54+
@Entity(name = "TreeNode")
55+
@Table(name = "TREE")
56+
public static class TreeNode {
57+
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
58+
@JoinColumn(name = "parentident")
59+
private TreeNode parent;
60+
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
61+
private Set<TreeNode> children = new HashSet<TreeNode>();
62+
@Id
63+
@GeneratedValue
64+
private long ident;
65+
}
66+
}

0 commit comments

Comments
 (0)