gpt4 book ai didi

java - 使用查询时,Hibernate 生成的列别名会破坏 AliasToBeanResultTransformer

转载 作者:行者123 更新时间:2023-11-29 10:19:08 25 4
gpt4 key购买 nike

我想要实现的是在按以下方式定义的查询上设置结果转换器:

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;
}
}

问题是,虽然我指定了 idobjectName 作为我的别名,但实际执行的查询使用不同的别名。这导致我的 AliasToBeanResultTransformer 无法构造 MyObject,因为别名与属性名称不匹配。

是否有可能以编程方式获取 hibernate 生成的查询的别名(我可以将它们设置为 bean 结果转换器的别名)?我尝试使用 query.getReturnAliases() 但它返回的是我在 HQL 中定义的别名,而不是 Hibernate 实际使用的别名。

我可以在 createQuery 语句中明确指定别名吗?目前我正在尝试不使用此标准来工作,所以我希望有一种使用查询对象的方法(如果存在的话)。


更新

虽然上述问题对于标准 HQL 查询无效(见评论),但在执行 native 查询时有效。具体来说—— native 查询似乎将所有别名都视为小写字符串(尽管查询中可能引入了特定的大写字母)。这会导致 AliasToBeanResultTransformer 在设置属性时失败(在大写很重要的情况下)。

最佳答案

其实不需要实现另一个AliasToBeanResultTransformer,你可以使用addScalar(String columnAlias, Type type)显式别名 native SQL 的列:

String nativeSQL = "select o.id as id, o.name as objectName from MyObject"; 
List<MyObject> resultList = session.createSQLQuery(nativeSQL)
.addScalar("id" ,StandardBasicTypes.INTEGER)
.addScalar("objectName",StandardBasicTypes.STRING)
.setResultTransformer(new AliasToBeanResultTransformer(MyObject.class))
.list();

转换器然后将寻找一个 MyObject 类并期望它具有 setter setId()setObjectName() 以便填充MyObject 实例的返回值

关于java - 使用查询时,Hibernate 生成的列别名会破坏 AliasToBeanResultTransformer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10008572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com