я могу указать тип возвращаемого значения в словах hql - PullRequest
0 голосов
/ 21 декабря 2010

Привет: Я использую hibernate3.6, я сталкиваюсь с некоторой проблемой, когда делаю некоторые запросы.

Возьмем этот hql для примера:

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

Теперь я могу получить свойства столбца изсписок следующим образом:

    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, но сумма равна нулю.Я тоже хочу 0.

Конечно, я могу выполнить преобразование явно, если знаю имя столбца и его тип (это количество, сумма в приведенном выше примере) таблицы результатов из db, но теперьЯ не знал.

То есть я не могу использовать что-то вроде этого:

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

Поскольку тип props [i] может быть строкой,в этом случае, если его значение равно нулю , оно должно быть "" .

Поэтому мне интересно, могу ли я разделить тип преобразования в словах hql?может быть что-то вроде этого:

выберите количество (отличный ip), (длинный) сумма (байты) от Entity en, где ....

выберите количество(отличный ip), (выпуклый ..сум (байты)) от Entity en, где ....

Возможно ли это?

BWT, Iиспользуйте mysql 5.1.

Спасибо.

ОБНОВЛЕНИЕ: @ zinan.yumak:

Ваш ответ выглядит так:

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

Если это так, мне нужно создать еще дополнительный класс, например Wrapper , поскольку в моем приложении так много типов select. Like:

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

......

1 Ответ

1 голос
/ 21 декабря 2010

Я думаю, что вам нужен преобразователь результата. Создайте класс модели для вашего запроса. Затем добавьте нулевые проверки или другие проверки в ваши методы установки. Как то так,

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

А в вашем классе Модель,

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