【发布时间】:2015-03-26 15:45:53
【问题描述】:
我想知道对于给定的 HQL 查询,生成的 SQL 查询是否始终相同,或者是否可以变化,尤其是在涉及别名时。 我问这个问题是因为我们的 DBA 抱怨这样一个事实,即对于给定的查询,生成的别名可能会因应用程序的一次运行而异。 感谢您的帮助。
问候, 尼古拉斯
【问题讨论】:
标签: java hibernate orm hql alias
我想知道对于给定的 HQL 查询,生成的 SQL 查询是否始终相同,或者是否可以变化,尤其是在涉及别名时。 我问这个问题是因为我们的 DBA 抱怨这样一个事实,即对于给定的查询,生成的别名可能会因应用程序的一次运行而异。 感谢您的帮助。
问候, 尼古拉斯
【问题讨论】:
标签: java hibernate orm hql alias
Hibernate 必须确保唯一别名,因为您也可以自行加入表,并且根据 Hibernate 源代码,org.hibernate.mapping.Column.getAlias() 方法不允许您覆盖默认的唯一别名策略:
public String getAlias(Dialect dialect) {
final int lastLetter = StringHelper.lastIndexOfLetter( name );
final String suffix = Integer.toString(uniqueInteger) + '_';
String alias = name;
if ( lastLetter == -1 ) {
alias = "column";
}
else if ( name.length() > lastLetter + 1 ) {
alias = name.substring( 0, lastLetter + 1 );
}
boolean useRawName = name.length() + suffix.length() <= dialect.getMaxAliasLength()
&& !quoted && !name.toLowerCase().equals( "rowid" );
if ( !useRawName ) {
if ( suffix.length() >= dialect.getMaxAliasLength() ) {
throw new MappingException( String.format(
"Unique suffix [%s] length must be less than maximum [%d]",
suffix, dialect.getMaxAliasLength() ) );
}
if ( alias.length() + suffix.length() > dialect.getMaxAliasLength() ) {
alias = alias.substring( 0, dialect.getMaxAliasLength() - suffix.length() );
}
}
return alias + suffix;
}
所以你被那些独特的名字困住了。
【讨论】: