HHH-14482 Do not discard prior implicit join by key
This commit is contained in:
parent
a022127428
commit
1905e8bba3
|
@ -45,6 +45,12 @@ public class DomainPathPart implements SemanticPathPart {
|
||||||
throw new SemanticException( "Cannot resolve path (`" + name + "`) relative to `" + lhs.getNavigablePath() + "`" );
|
throw new SemanticException( "Cannot resolve path (`" + name + "`) relative to `" + lhs.getNavigablePath() + "`" );
|
||||||
}
|
}
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
|
final SqmPath<?> existingImplicitJoinPath = lhs.getImplicitJoinPath( name );
|
||||||
|
if ( existingImplicitJoinPath != null ) {
|
||||||
|
currentPath = existingImplicitJoinPath;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
currentPath = subPathSource.createSqmPath( lhs, creationState );
|
currentPath = subPathSource.createSqmPath( lhs, creationState );
|
||||||
if ( isTerminal ) {
|
if ( isTerminal ) {
|
||||||
return currentPath;
|
return currentPath;
|
||||||
|
|
|
@ -125,11 +125,21 @@ public abstract class AbstractSqmPath<T> extends AbstractSqmExpression<T> implem
|
||||||
}
|
}
|
||||||
|
|
||||||
final String relativeName = path.getNavigablePath().getLocalName();
|
final String relativeName = path.getNavigablePath().getLocalName();
|
||||||
if ( !implicitJoinPaths.containsKey( relativeName ) ) {
|
|
||||||
implicitJoinPaths.put( relativeName, path );
|
final SqmPath<?> previous = implicitJoinPaths.put( relativeName, path );
|
||||||
|
if ( previous != null && previous != path ) {
|
||||||
|
throw new IllegalStateException( "Implicit-join path registration unexpectedly overrode previous registration - " + relativeName );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqmPath<?> getImplicitJoinPath(String name) {
|
||||||
|
if ( implicitJoinPaths == null ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return implicitJoinPaths.get( name );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getExplicitAlias() {
|
public String getExplicitAlias() {
|
||||||
return getAlias();
|
return getAlias();
|
||||||
|
|
|
@ -77,6 +77,8 @@ public interface SqmPath<T> extends SqmExpression<T>, SemanticPathPart, JpaPath<
|
||||||
*/
|
*/
|
||||||
void registerImplicitJoinPath(SqmPath<?> path);
|
void registerImplicitJoinPath(SqmPath<?> path);
|
||||||
|
|
||||||
|
SqmPath<?> getImplicitJoinPath(String name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This node's type is its "referenced path source"
|
* This node's type is its "referenced path source"
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -54,14 +54,35 @@ public class SubQueryImplicitJoinReferenceTest {
|
||||||
public void performHqlTest(SessionFactoryScope scope) {
|
public void performHqlTest(SessionFactoryScope scope) {
|
||||||
// Now simulate running an audit query
|
// Now simulate running an audit query
|
||||||
scope.inSession( session -> {
|
scope.inSession( session -> {
|
||||||
session.createQuery( "select e__ FROM org.hibernate.orm.test.SubQueryImplicitJoinReferenceTest$TheEntity e__ "
|
session.createQuery( "select e__ FROM TheEntity e__ "
|
||||||
+ "WHERE e__.originalId.rev.id = (select max(e2__.originalId.rev.id) FROM "
|
+ "WHERE e__.originalId.rev.id = (select max(e2__.originalId.rev.id) FROM "
|
||||||
+ "org.hibernate.orm.test.SubQueryImplicitJoinReferenceTest$TheEntity e2__ WHERE " +
|
+ "TheEntity e2__ WHERE " +
|
||||||
"e2__.originalId.rev.id <= 2 and e__.originalId.id = e2__.originalId.id)" ).list();
|
"e2__.originalId.rev.id <= 2 and e__.originalId.id = e2__.originalId.id)" ).list();
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity
|
@Test
|
||||||
|
public void performHqlTest2(SessionFactoryScope scope) {
|
||||||
|
// Now simulate running an audit query
|
||||||
|
scope.inSession( session -> {
|
||||||
|
session.createQuery( "select e__ FROM TheEntity e__ "
|
||||||
|
+ "WHERE e__.originalId.id = (select max(e2__.originalId.id) FROM "
|
||||||
|
+ "TheEntity e2__ WHERE " +
|
||||||
|
"e__.originalId.id = e2__.originalId.id and e2__.originalId.rev.id <= 2)" ).list();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void performHqlTest3(SessionFactoryScope scope) {
|
||||||
|
// Now simulate running an audit query
|
||||||
|
scope.inSession( session -> {
|
||||||
|
session.createQuery( "select e2__.originalId.id, e2__.originalId.rev.id FROM "
|
||||||
|
+ "TheEntity e2__ WHERE " +
|
||||||
|
" e2__.originalId.rev.id <= 2" ).list();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "TheEntity")
|
||||||
public static class TheEntity {
|
public static class TheEntity {
|
||||||
@EmbeddedId
|
@EmbeddedId
|
||||||
private OriginalId originalId;
|
private OriginalId originalId;
|
||||||
|
|
Loading…
Reference in New Issue