Fix issue with query alias case sensitive and JPAQL strict compliance

This commit is contained in:
Andrea Boriero 2021-08-09 11:30:58 +02:00 committed by Andrea Boriero
parent d4c296b732
commit fb62f9611a
2 changed files with 97 additions and 2 deletions

View File

@ -233,9 +233,13 @@ public class SqmPathRegistryImpl implements SqmPathRegistry {
public SqmAliasedNode<?> findAliasedNodeByAlias(String alias) {
assert alias != null;
final String aliasToUse = jpaCompliance.isJpaQueryComplianceEnabled()
? alias.toLowerCase( Locale.getDefault() )
: alias;
for ( int i = 0; i < simpleSelectionNodes.size(); i++ ) {
final SqmAliasedNode<?> node = simpleSelectionNodes.get( i );
if ( alias.equals( node.getAlias() ) ) {
if ( aliasToUse.equals( node.getAlias() ) ) {
return node;
}
}
@ -249,11 +253,15 @@ public class SqmPathRegistryImpl implements SqmPathRegistry {
return null;
}
final String aliasToUse = jpaCompliance.isJpaQueryComplianceEnabled()
? alias.toLowerCase( Locale.getDefault() )
: alias;
// NOTE : 1-based
for ( int i = 0; i < simpleSelectionNodes.size(); i++ ) {
final SqmAliasedNode<?> node = simpleSelectionNodes.get( i );
if ( alias.equals( node.getAlias() ) ) {
if ( aliasToUse.equals( node.getAlias() ) ) {
return i + 1;
}
}

View File

@ -0,0 +1,87 @@
package org.hibernate.orm.test.jpa;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.cfg.Environment;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.ServiceRegistry;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.hibernate.testing.orm.junit.Setting;
import org.junit.jupiter.api.Test;
@DomainModel(
annotatedClasses = JpaqlStrictComplianceAliasTest.Part.class
)
@ServiceRegistry(
settings = @Setting(name = Environment.JPAQL_STRICT_COMPLIANCE, value = "true")
)
@SessionFactory
public class JpaqlStrictComplianceAliasTest {
@Test
public void testAlias(SessionFactoryScope scope) {
scope.inTransaction(
session ->
session.createQuery( "select p.stockNumber as stockNo FROM Part p ORDER BY stockNo" )
.getResultList()
);
}
@Test
public void testAlias2(SessionFactoryScope scope) {
scope.inTransaction(
session ->
session.createQuery( "select p.stockNumber as stockNo FROM Part P ORDER BY stockNo" )
.getResultList()
);
}
@Test
public void testAlias3(SessionFactoryScope scope) {
scope.inTransaction(
session ->
session.createQuery( "select P.stockNumber as stockNo FROM Part P ORDER BY stockNo" )
.getResultList()
);
}
@Entity(name = "Part")
public static class Part {
@Id
private Long id;
private String name;
private String stockNumber;
public Part() {
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStockNumber() {
return stockNumber;
}
public void setStockNumber(String stockNumber) {
this.stockNumber = stockNumber;
}
}
}