您好: 我正在使用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...
......
答案 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;
}
}
.
.
.
}