Будьте в спящем режиме засовывая Нулевые значения в список

Я наследовал немного кода Java, который В спящем режиме использование. Некоторые люди, использующие этот код, теперь сообщают, что получают NullPointerExceptions повсеместно.

Я смог разыскать это и нашел, что, когда мы выполняем запрос, который вытягивает список объектов от базы данных, которая имеет список объектов (который вытягивают от другой таблицы) В спящем режиме, кажется, покидает дыры в списке (Нулевые значения). Таким образом, список может посмотреть что-то как:

Object
Object
NULL
Object

Код, который мы используем для вытаскивания информации из базы данных:

List<PrinterGroup> groups = 
    this.getSession().createQuery( "from PrinterGroup" ).list();

И затем в каждом PrinterGroup список Фильтров, которые имеют Нулевые значения в них.

В то время как я мог обойти и найти, что каждый экземпляр был, мы циклично выполняемся по этому списку и добавляем ПУСТУЮ проверку, я чувствую, что это - лейкопластырь, фиксируют, и должен быть способ сказать, в спящем режиме для не втягивания нулевых значений.

Править:

  • Мы используем, в спящем режиме 3.2.2

EDIT2:

Таким образом, база данных, казалось, сбивала с толку. PrinterGroup-> отношения Фильтра является связью "один ко многим". Таким образом, PrinterGroups имеют список фильтров. Проблема состоит в том, что список фильтров имеет нулевые значения в нем, когда он выходит из базы данных (Нет никаких нулевых значений в базе данных между прочим), и список выходит, будучи похож выше.

EDIT3:

Вот отображающийся соответствующий picese в PrinterGroup HBM

<subclass name="PrinterGroup" discriminator-value="PG">
   <list name="filters"
              lazy="true"
              table="PG_FILTER"
               inverse="false"
                cascade="all-delete-orphan">

        <key>
           <column name="PG_ID" not-null="false"/>
        </key>
        <index column="LISTPOSITION"/>
        <one-to-many class="Filter"/>
     </list>

И Фильтр является довольно основным отображением POJO.

11
задан Patrick McDaniel 16 July 2010 в 20:39
поделиться

5 ответов

Сопоставлена ли эта коллекция с <списком> (или другой индексированной коллекцией) и <списком-индексом>?

Всем сопоставлениям коллекций, кроме тех, которые имеют семантику набора и мешка, нужен столбец индекса в таблице коллекции. Индексный столбец - это столбец, который отображается на индекс массива, или индекс списка, или ключ карты. ... Индекс массива или списка всегда имеет тип integer и сопоставляется с элементом. Сопоставленный столбец содержит последовательные целые числа, которые по умолчанию нумеруются с нуля".

Я полагаю, что при использовании индексированной коллекции, если ваш индексный столбец имеет пробелы (т.е. имеет значения типа 0, 1, 3, 7), то Hibernate заполнит результирующий List пустыми элементами в ожидаемых местах.

17
ответ дан 3 December 2019 в 05:56
поделиться

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

0
ответ дан 3 December 2019 в 05:56
поделиться

Как насчет простой фильтрации нулевых фильтров с помощью HQL

List<PrinterGroup> groups = 
    this.getSession().createQuery( "Select pg from PrinterGroup pg where pg.filter is not null" ).list();

Я предполагаю, что ваше свойство называется «фильтром»

0
ответ дан 3 December 2019 в 05:56
поделиться
List<PrinterGroup> groups = this.getSession().createCriteria( PrinterGroup.class ).add(Restrictions.isNotNull("filters")).list();
2
ответ дан 3 December 2019 в 05:56
поделиться

Хорошо, поэтому объекты PrinterGroup сами по себе не являются нулевыми, но у них есть нулевые ссылки на объекты типа Filter? Или ненулевые ссылки на списки фильтров, которые содержат нулевые фильтры?

Очевидный ответ состоит в том, что база данных содержит отношение «многие ко многим» между PrinterGroup и Filter и имеет нулевые значения базы данных для фильтров, например:

 select * from printer_group_filter;
 id    printergroup_id   filter_id
 1     1                1
 2     1                null
 3     1                2
 4     2                1
 5     2                null

Если фильтр может быть нулевым, то это ваше требование. Или вы можете использовать идиому NullObject, чтобы сделать «нулевой фильтр» реальным объектом, хотя с Hibernate это будет непросто.

Если фильтр не может иметь значение NULL, исправьте данные, добавьте ограничение «not-NULL» к параметру «многие ко многим» и исправьте проверку ввода, чтобы предотвратить добавление дополнительных значений NULL.

1
ответ дан 3 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: