powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / EclipseLink - The primary key read from the row...Primary keys must not contain null.
2 сообщений из 2, страница 1 из 1
EclipseLink - The primary key read from the row...Primary keys must not contain null.
    #38312116
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил потестировать новую реализацию JPA2.1 от EclipseLink
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    private void testDB(){
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Object> criteriaQuery = cb.createQuery();
        Root<Schet> schet = criteriaQuery.from(Schet.class);
        Join sluch=schet.join(Schet_.sluchList, JoinType.LEFT);
        Join usl=sluch.join(Sluch_.uslList, JoinType.LEFT);
        sluch.on(cb.like(sluch.get(Sluch_.dsMain), "Z01.7%"));
        CriteriaQuery<Object> select = criteriaQuery.multiselect(schet,sluch);
        
        
        TypedQuery<Object> typedQuery = em.createQuery(select);
        typedQuery.setMaxResults(MAX_RESULTS);
        //typedQuery.setFirstResult(criteria.getFirstResult());
        List some_ret = (List) typedQuery.getResultList();
        System.out.println("Size: "+some_ret.size());
        String gg="";
    }



Опять такая же ошибка в multiselect как и в версии 2.3. Вроде обящали эту фигню исправить, но не исправили.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Caused by: Exception [EclipseLink-6044] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.QueryException
Exception Description: The primary key read from the row [DatabaseRecord(
	DB.SLUCH.CODE_MES1 => null
	DB.SLUCH.CODE_MES2 => null
	DB.SLUCH.COMENTSL => null
	DB.SLUCH.ID_SLUCH => null
	DB.SLUCH.ID_PAK => null
	DB.SLUCH.STATUS => null)] during the execution of the query was detected to be null.  Primary keys must not contain null.



Запрос генерируется правильный:
Код: sql
1.
SELECT * FROM (SELECT /*+ FIRST_ROWS */ a.*, ROWNUM rnum  FROM (SELECT t0.ID_PAK AS a1, t0.CODE_MO AS a2, t0.COMENTS AS a3, t1.ID_SLUCH AS a67, t1.ID_PAK AS a68, t1.STATUS AS a69 FROM MEDFIN.SCHET t0 LEFT OUTER JOIN MEDFIN.SLUCH t1 ON ((t1.ID_PAK = t0.ID_PAK) AND t1.DS_MAIN LIKE ?) LEFT OUTER JOIN MEDFIN.USL t2 ON ((t2.ID_PAK = t1.ID_PAK) AND (t2.ID_SLUCH = t1.ID_SLUCH))) a WHERE ROWNUM <= ?) WHERE rnum > ?")


В Hibernate такого нет, но у него JPA2.1 ещё в beta-версии. Стоит ли его использовать?
Надо бы ещё subquery проверить. У EclipseLink там тоже были глюки.
...
Рейтинг: 0 / 0
EclipseLink - The primary key read from the row...Primary keys must not contain null.
    #38312240
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Впринципе, ту фигню можно обойти и так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    private void testDB(){
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Object> criteriaQuery = cb.createQuery();
        Root<Schet> schet = criteriaQuery.from(Schet.class);
        Join sluch=schet.join(Schet_.sluchList, JoinType.LEFT);
        Join usl=sluch.join(Sluch_.uslList, JoinType.LEFT);
        //cb.coalesce(sluch.get(Sluch_.dsDead),"GGG");
        Expression er=sluch.get(Sluch_.dsMain);
        sluch.on(cb.and(cb.like(sluch.get(Sluch_.dsMain), "Z01.7%"),
                cb.notEqual(sluch.get(Sluch_.dsDead), "GGG"),
                cb.notEqual(cb.nullif(sluch.get(Sluch_.dsDead), "HH"),"HH")
                ));
        CriteriaQuery<Object> select = criteriaQuery.multiselect(schet,sluch.get(Sluch_.sluchPK));
        
        
        Subquery<String> schetSubquery=criteriaQuery.subquery(String.class);
        Root<Schet> subSchet=schetSubquery.from(Schet.class);
        schetSubquery.select(subSchet.get(Schet_.idPak));
        
        Subquery<String> uslSubquery=criteriaQuery.subquery(String.class);
        Root<Usl> subUsl=uslSubquery.from(Usl.class);
        uslSubquery.select(subUsl.get(Usl_.uslPK).get(UslPK_.idPak)).where(cb.in(subUsl.get(Usl_.uslPK).get(UslPK_.idPak)).value(schetSubquery)); //.where(cb.and(
//                cb.equal(sluch.get(Sluch_.sluchPK).get(SluchPK_.idPak), usl.get(Usl_.uslPK).get(UslPK_.idPak)),
//                cb.equal(sluch.get(Sluch_.sluchPK).get(SluchPK_.idSluch), usl.get(Usl_.uslPK).get(UslPK_.idSluch))
//                ));
        
        

        
        
        select.where(cb.in(schet.get(Schet_.idPak)).value(uslSubquery));
        
        TypedQuery<Object> typedQuery = em.createQuery(select);
        typedQuery.setMaxResults(MAX_RESULTS);
        //typedQuery.setFirstResult(criteria.getFirstResult());
        List some_ret = (List) typedQuery.getResultList();
        System.out.println("Size: "+some_ret.size());
        String gg="";
    }



Hibernate так и делает. Когда он получает root, то он просто ID запрашивает, а потом неявно делает find.
Если использовать EclipseLink, то можно делать это явно. Вот и всё.


Я тут ещё поупражнялся и получилось так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SELECT *
FROM
  (SELECT
    /*+ FIRST_ROWS */
    a.*,
    ROWNUM rnum
  FROM
    (SELECT t0.ID_PAK AS a1,
      t0.CODE_MO      AS a2,
      t0.COMENTS      AS a3,
      t0.CRC32        AS a4,
....
....
      t1.ID_SLUCH     AS a17,
      t1.ID_PAK       AS a18
    FROM MEDFIN.SCHET t0
    LEFT OUTER JOIN MEDFIN.SLUCH t1
    ON ((t1.ID_PAK = t0.ID_PAK)
    AND ((t1.DS_MAIN LIKE ?
    AND (t1.DS_DEAD            <> ?))
    AND (NULLIF(t1.DS_DEAD, ?) <> ?)))
    LEFT OUTER JOIN MEDFIN.USL t2
    ON ((t2.ID_PAK   = t1.ID_PAK)
    AND (t2.ID_SLUCH = t1.ID_SLUCH))
    WHERE t0.ID_PAK IN
      (SELECT t3.ID_PAK
      FROM MEDFIN.USL t3
      WHERE t3.ID_PAK IN
        (SELECT t4.ID_PAK FROM MEDFIN.SCHET t4
        )
      )
    ) a
  WHERE ROWNUM <= ?
  )
WHERE rnum > ?



Меня радует, что под JOIN можно сувать всё что угодно.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / EclipseLink - The primary key read from the row...Primary keys must not contain null.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]