Пустые значения в столбце по умолчанию с использованием фильтра ROWNUM - PullRequest
1 голос
/ 05 марта 2019

У меня странное поведение с базой данных Oracle 11.2.0.1.0.

С этой таблицей:

  CREATE TABLE "COMPANIES" 
   (    "ID" NUMBER(19,0) NOT NULL ENABLE, 
"COMMENTS" VARCHAR2(3999 CHAR), 
"NAME" VARCHAR2(126 CHAR) NOT NULL ENABLE, 
"IDENTIFICATIONCODE" VARCHAR2(126 CHAR), 
"REMOVALDATE" TIMESTAMP (6), 
"BLACKLIST" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE, 
"BLACKLISTREASON_ID" NUMBER(19,0), 
"BLACKLISTCOMMENTS" VARCHAR2(3999 CHAR), 
 CONSTRAINT "COMPANIES_PK" PRIMARY KEY ("ID")

Этот запрос возвращает этот набор результатов:

SELECT id643_1_, blacklist643_1_ FROM (
    select this_.id AS id643_1_,this_.blacklist AS blacklist643_1_
    from companies this_
    where this_.id IN (
        SELECT DISTINCT this2_.id AS y0_
        FROM companies this2_
        WHERE ( this2_.removaldate IS NULL OR this2_.removaldate >= to_timestamp('03/06/2019 00:00:00.000','mm/dd/yyyy hh24:mi:ss.ff3')))
        ORDER BY this_.name ASC
) WHERE ROWNUM <= 2147483647;

id643_1_  blacklist643_1_ 
3869594   [NULL]
3869596   [NULL]
3869597   [NULL]
3869592   [NULL]
3869598   [NULL]
3869599   [NULL]

Но либо удаление фильтра ROWNUM:

SELECT id643_1_, blacklist643_1_ FROM (
    select this_.id AS id643_1_,this_.blacklist AS blacklist643_1_
    from companies this_
    where this_.id IN (
        SELECT DISTINCT this2_.id AS y0_
        FROM companies this2_
        WHERE ( this2_.removaldate IS NULL OR this2_.removaldate >= to_timestamp('03/06/2019 00:00:00.000','mm/dd/yyyy hh24:mi:ss.ff3')))
        ORDER BY this_.name ASC
) 
--WHERE ROWNUM <= 2147483647;

id643_1_  blacklist643_1_ 
3869594   0
3869596   0
3869597   0
3869592   0
3869598   0
3869599   0

или внутренний фильтр «IN»:

SELECT id643_1_, blacklist643_1_ FROM (
    select this_.id AS id643_1_,this_.blacklist AS blacklist643_1_
    from companies this_
    --where this_.id IN (
        --SELECT DISTINCT this2_.id AS y0_
        --FROM companies this2_
        --WHERE ( this2_.removaldate IS NULL OR this2_.removaldate >= to_timestamp('03/06/2019 00:00:00.000','mm/dd/yyyy hh24:mi:ss.ff3')))
        --ORDER BY this_.name ASC
) 
WHERE ROWNUM <= 2147483647;

id643_1_  blacklist643_1_ 
3869594   0
3869596   0
3869597   0
3869592   0
3869598   0
3869599   0

Возвращает правильное значение по умолчанию!

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

Понятия не имею, почему это происходит.

Update1:

Аналогичная таблица, похожий запрос:

select * from (
    select *
    from incidents this_
    where this_.id in (select tab2.id from incidents tab2)
    order by this_.id
) where rownum <= 1000; 

id        BLACKLIST   FAILED      FAILEDDATE
1100071   0           0           [NULL]
1100112   0           1           2013-01-28 00:00:00
1100155   0           0           [NULL]    
1100203   0           0           [NULL]
1100241   0           0           [NULL]    
1100301   0           0           [NULL]

И с большим ROWNUM:

select * from (
    select *
    from incidents this_
    where this_.id in (select tab2.id from incidents tab2)
    order by this_.id
) where rownum <= 1000000; 

id        BLACKLIST   FAILED      FAILEDDATE
1100071   [NULL]      [NULL]      [NULL]
1100112   [NULL]      [NULL]      [NULL]
1100155   [NULL]      [NULL]      [NULL]    
1100203   [NULL]      [NULL]      [NULL]
1100241   [NULL]      [NULL]      [NULL]    
1100301   [NULL]      [NULL]      [NULL]

UPDATE2:

Это не происходит на 11.2.0.3.0, поэтому я думаю, что это ошибка. Я оставлю вопрос открытым, если кто-нибудь с этим столкнется.

...