Метод критериев Session.createCriteria (класс таблицы namw), извлекающий повторяющиеся строки - PullRequest
0 голосов
/ 15 января 2019

Мы используем метод session.createCriteria (HLink.class) для извлечения записей из таблицы, но он извлекает повторяющиеся записи в списке.

Когда я вижу в списке объектов, он показывает дубликаты записей первой строки из таблицы.

Ниже приведен файл отображения спящего режима

<hibernate-mapping package="com.stockmann.framework.service.hierarchy">
    <class name="HLink" table="STOCKMANN.HLINK" lazy="true">

        <composite-id>
            <key-property name="linkId" column="LINKID" type="integer"/>
            <key-property name="fromHierarchy" column="FROMHIERARCHY" type="integer"/>
            <key-property name="fromNode" column="FROMNODE" type="integer"/>
        </composite-id>

        <property name="toHierarchy" column="TOHIERARCHY" type="integer"/>
        <property name="toNode" column="TONODE" type="integer"/>

    </class>
</hibernate-mapping> 

Когда я пытался выполнить запрос в базе данных, он возвращает правильные записи.

select * 
from stockmann.hlink 
where LINKID = 130 
  and FROMHIERARCHY = 1 
  and FROMNODE = 3743 
  and TOHIERARCHY = 30;

Записи:

130 1   3743    30  8
130 1   3743    30  186
130 1   3743    30  190

Но когда я вижу в списке объектов в Java, он показывает, как показано ниже:

List object :[
com.stockmann.framework.service.hierarchy.HLink@695fc665[linkId=130,fromHierarchy=1,fromNode=3743,toHierarchy=30,toNode=8],
com.stockmann.framework.service.hierarchy.HLink@695fc665[linkId=130,fromHierarchy=1,fromNode=3743,toHierarchy=30,toNode=8],
com.stockmann.framework.service.hierarchy.HLink@695fc665[linkId=130,fromHierarchy=1,fromNode=3743,toHierarchy=30,toNode=8]
]

Пожалуйста, помогите мне в этом, чтобы получить реальные записи из таблицы вместо одного дублирования записи.

1 Ответ

0 голосов
/ 15 января 2019

У вас есть недостаток дизайна в вашей таблице или картировании.

Ваше отображение говорит, {LINKID, FROMHIERARCHY, FROMNODE} - это первичный ключ (PK) сущности HLink. Но, напротив, ваша схема позволяет вставлять несколько записей, имеющих одинаковую комбинацию {LINKID, FROMHIERARCHY, FROMNODE} общего, что доказано вашим необработанным ответом на запрос SQL. Вы должны определить уникальный индекс или первичный ключ для {LINKID, FROMHIERARCHY, FROMNODE}.

В качестве альтернативы вы не должны лгать Hibernate, говоря ей, что это был первичный ключ - это просто не так.

Почему объекты дублируются?

Когда Hibernte читает ответ на SQL-запрос, для каждой строки с разными значениями PK будет создан новый объект сущности HLink. Hibernate читает 130 1 3743 30 8 и создает экземпляр для недавно обнаруженного PK PK {130, 1, 3743}, помещая этот экземпляр сущности в кэш сеанса l1. Для обеих дополнительных записей Hibernate распознает: «О, у меня уже есть эта сущность с PK {130, 1, 3743} в кэше, поэтому мне не нужно проверять полную запись результата, а просто снова добавить кэшированный экземпляр в список результатов запроса».

Edit:

Чтобы решить эту проблему, вы можете либо добавить PK в структуру таблицы и отобразить его как @Id, либо найти комбинацию уникальных столбцов и отобразить их как составной идентификатор, как вы уже сделали с неуникальным столбцом. сочетание. Hibernate не работает без идентификатора, так как ответ на этот вопрос гласит .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...