2012-02-28 1 views
3

Я пытаюсь получить минимальное значение столбца в таблице. Это звучит тривиально, но у меня возникают проблемы (я использую базу данных MySql 5.1).Hibernate Projections.min() возвратил несколько строк

Ситуация немного сложная. У нас есть интерфейс, который реализуется из двух классов. Каждый из этих двух классов расширен из трех других классов. Каждый два из этих трех extendors имеют спящий режим отображения (базовые классы также отображение) => поэтому мы имеем интерфейс I реализован

CLASSA (преобразовываться) расширен classA1 (отображается), classA2 (отображается), classA3 (не отображается) ClassB (отображается) продлен classB1 (преобразовываться), classB2 (преобразовываться), classB3 (не отображается)

Здесь проблема с примером кода:

Criteria c = getSession().createCriteria(samplesType) 
    .setProjection(Projections.min("pollingTime")); 
List resultList= c.list()`enter code here`; 

После выполнения .list() в списке результатов есть три значения: Первый - это нуль, второй - нуль, третий содержит правильное минимальное значение, которое я ищу.

я использовал c.uniqueResult(), но она "возвращает"

org.hibernate.NonUniqueResultException: запрос не возвращает уникальный результат: 3

Я также попытался использовать в Hibernate

createQuery(select min(pollingTime) from tableName).list() 

но результат тот же (два нуля и один с правильным результатом).

Я также попытался добавить предопределенный ResultTransformer, чтобы удалить нулевые значения из списка, но я потерпел неудачу.

В качестве временного решения можно получить требуемое минимальное значение с помощью SQL-запроса:

createSQLQuery("SELECT MIN(pool_time) FROM tableName") 

который является единственным решением на данный момент.

У вас есть идеи, по которым возвращенный результат неверен?

С уважением, Niki

ответ

1

Я нашел причину возврата этого нуля. Как я описал, в системе есть некоторое наследование. Итак, при поиске минимального значения в таблице базового класса, hibernate пытается найти минимальные значения для всех таблиц подклассов. В нашем случае таблицы подклассов пусты, поэтому минимального значения нет, поэтому он находит правильное значение вместе с нулевыми значениями из таблиц подклассов.

В качестве решения этой проблемы я поставил полиморфизм в явной в файле отображения Hibernate:

<class name="class" table="TABLE" polymorphism="explicit"> 

Вышеприведенные отключает поиск в указанной таблице при поиске суперкласса таблицы.

Niki

2

Вместо того, чтобы сосредоточиться на устранении null S из списка, я думаю, вы должны выяснить, где они приходят. Интересно, у вас есть таблицы, где значение этого столбца равно NULL? Возможно, вам стоит попробовать что-то вроде:

select min(r.pollingTime) from r : tableName where r.pollingTime != NULL 
+0

На самом деле это одна из первых вещей, которые я проверил непосредственно с MySQL Query Browser. В этом столбце нет нулевых значений. Это хороший момент, учитывая, что этот столбец не является уникальным ключом и не установлен как недействительный. Niki Редактировать: Я также согласен с тем, что лучше узнать, почему я получаю нулевые значения, а не нахожу способ их фильтрации из результата. – user1228603

+0

Я также пробовал следующий код. Строка qryStr = "select min (tn.pollingTime) from" + tableName + "tn, где tn.pollingTime! = NULL"; Список результатовList = getSession(). CreateQuery (qryStr) .list(); Результат в списке теперь отменен: minValue, null, null. Похоже, что как только я использую hibernate (query, creteria, projection и т. Д.) Для этой задачи, он возвращает неверные результаты. – user1228603

1

В зависимости от вашего типа данных минимальное значение для целого числа и строки может отличаться. Например, 1, 2, 11, если считать целым числом 11, является макс. Но если взять как строку 2, то макс.

Проверьте тип данных столбца.

+0

Тип данных длинный во всех файлах сопоставления. Он содержит время в миллисекундах, хранящееся долго в классах и db (как определено в сопоставлении спящего режима). – user1228603

Смежные вопросы