Hibernate Projection.min () возвратил несколько строк - PullRequest
3 голосов
/ 28 февраля 2012

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

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

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 () в resultList есть три значения: Первый ноль, второй ноль, третий содержит правильное минимальное значение, которое я ищу.

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

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

    select min(r.pollingTime) from r : tableName where r.pollingTime != NULL
1 голос
/ 29 февраля 2012

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

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

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

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

Niki

1 голос
/ 28 февраля 2012

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

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

...