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

Iva*_*vov 1 java alias hibernate nativequery

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

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();
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我可以在createQuery语句中明确指定别名吗?目前我试图不使用标准来工作,所以我很欣赏使用查询对象的方法,如果存在的话.


更新

虽然上述问题对于标准HQL查询(请参阅注释)无效,但在执行本机查询时它是有效的.具体而言 - 本机查询似乎将所有别名视为低位字符串(尽管可能在查询中引入了特定的大小写).AliasToBeanResultTransformer在资本化很重要的情况下,这会导致在设置属性时失败.

Ken*_*han 7

实际上不需要实现另一个 AliasToBeanResultTransformer,您可以使用addScalar(String columnAlias,Type type)显式别名本机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();
Run Code Online (Sandbox Code Playgroud)

然后变换器将查找一个MyObject类并期望它具有setter setId()并且setObjectName()为了将返回的值填充到MyObject 实例中