我可以在hql单词中指定返回类型

时间:2010-12-21 01:22:25

标签: java hibernate hql type-conversion

您好: 我正在使用hibernate3.6,在进行一些查询时遇到了一些问题。

将这个hql用于exmaple:

String hql="select count(distinct ip),sum(bytes) from Entity en where ....
Query q=Session.createQuery(hql);
List<?> list=q.list();

现在我可以通过以下方式从列表中检索columen属性:

    String[] properties={"count","sum"};
    for (Object obj : list) {
            Map<String, Object> m = new HashMap<String, Object>();
            Object[] props = (Object[]) obj;
            if(properties.length!=props.length) throw ....
            for (int i = 0; i < props.length; i++) {
                m.put(properties[i], props[i]);
            }
    }

现在,我的问题是,当hql结果没有设置时,计数为0,但总和为空。我也想要它。

当然,如果知道db的结果表中的列名和类型(它们是上面例子中的count,sum),我可以显式转换,但现在我不知道。

那就是说,我不能使用这样的东西:

if(props[i]=null) props[i]=0;
m.put(properties[i], props[i]);

由于道具[i] 的类型可能是字符串,在这种情况下如果其值为空,则应为“”

所以我想知道我是否可以分离hql词中的转换类型?也许有点像这样:

  

选择计数(不同   ip),(long)来自实体en的sum(字节)   哪里....

     

选择计数(不同的ip),(converet   ..sum(bytes))来自Entity en where   ....

这可能吗?

BWT,我使用的是mysql 5.1。

感谢。

更新 @ zinan.yumak:

你的答案好像是这样;

select new Wrapper(count(distinct ip),sum(bytes)) from Entity en where...

如果是这样,我必须创建enougth 额外的类,如Wrapper ,因为我的应用程序中有很多类型的select.like:

select new AnotherWrapper(broswer,count(distinct brower)) from Entity en where...

......

1 个答案:

答案 0 :(得分:1)

我认为你需要的是一个结果变换器。为您的查询创建一个模型类。 然后将空检查或其他检查添加到您的setter方法中。像这样的东西,

String hql="select count(distinct ip) as ip, sum(bytes) as bytes from Entity en where ....
Query q=Session.createQuery(hql).setResultTransformer(Transformers.aliasToBean(Model.class));

在你的Model类中,

class Model {
    private String ip = "";
    private BigDecimal bytes = BigDecimal.ZERO;

    public void setIp(String anIp) {
        if ( aString != null) {
            this.ip = anIp;
        }
    }   

    public void setBytes(String aByte) {
        if ( aByte != null) {
            this.byte = aByte;
        }
    }   
    .
    .
    .
}