【发布时间】:2012-04-18 00:15:25
【问题描述】:
我想要实现的是在以下列方式定义的查询上设置结果转换器:
String hqlQueryString = "select o.id as id, o.name as objectName from MyObject";
Class resultClass = MyObject.class;
Query query = session.createQuery(hqlQueryString).setResultTransformer(
new new AliasToBeanResultTransformer(resultClass));
List result = query.list();
MyObject 看起来像这样:
public class MyObject {
private int id;
private String objectName;
public int getId() {
return id;
}
public void setId(int value) {
this.id = value;
}
public String getObjectName() {
return objectName;
}
public void setobjectName(String value) {
this.objectName = value;
}
}
问题是,虽然我指定了id 和objectName 作为我的别名,但实际执行的查询使用不同的别名。这会导致我的AliasToBeanResultTransformer 无法构造MyObject,因为别名与属性名称不匹配。
是否可以通过编程方式获取hibernate生成的查询的别名(我可以将它们设置为bean结果转换器的别名)?我尝试使用query.getReturnAliases(),但它返回的是我在 HQL 中定义的别名,而不是 Hibernate 实际使用的别名。
我可以在createQuery 语句中明确指定别名吗?目前我正在尝试不使用标准来实现这一点,因此如果存在这样的查询对象,我将不胜感激。
更新
虽然上述问题对标准 HQL 查询无效(请参阅 cmets),但在执行本机查询时有效。具体来说 - 本机查询似乎将所有别名视为小写字符串(尽管可能在查询中引入了特定的大写字母)。这会导致 AliasToBeanResultTransformer 在设置属性时失败,在大写重要的情况下。
【问题讨论】:
-
这很奇怪,因为我还在 HQL 中使用
as指定了别名,它工作正常。 -
你也使用
session.createQuery(...)方法吗?我认为如果改为使用标准,则不应该出现问题。 -
您的评论具有误导性。问题解决了吗?
-
@IvayloSlavov 。是的,我使用
session.createQuery(hqlQueryString )并在 HQL 中使用as指定别名,它工作正常。 -
@ManuPK 其实问题已经解决了,还在使用
session.createQuery(hqlQueryString )。显然,@KenChan 是正确的,如果在查询中指定别名,它仍然有效,但 Hibernate 仍然会产生一个带有不同别名的混淆查询输出,这会误导我认为问题是别名。相反,我的 setter 类型不匹配。
标签: java hibernate alias nativequery