Как создать временный столбец + когда + упорядочить с помощью Criteria Builder - PullRequest
0 голосов
/ 31 декабря 2018

вот SQL-оператор, который я пытаюсь перевести в jpa:

  select 
        id,
        act_invalidation_id, 
        last_modification_date,
        title,
        case when act_invalidation_id is null then 1 else 0 end as test
    from act order by test, last_modification_date desc

Фактический перевод

Root<Act> act = query.from(Act.class);

builder.selectCase()
                .when(builder.isNull(actRoot.get("actInvalidation")), 1)
                .otherwise(0).as(Integer.class);
Expression<?> actInvalidationPath = actRoot.get("actInvalidation");
Order byInvalidationOrder = builder.asc(actInvalidationPath);

Path<Date> publicationDate = actRoot.get("metadata").get("publicationDate");
Order byLastModificationDate = builder.desc(publicationDate);

query.select(act).orderBy(byInvalidationOrder, byLastModificationDate);
entityManager.createQuery(query).getResultList();

Я пытаюсь создать временный столбец (именованный тест) из Integerвведите и упорядочите этот столбец, затем упорядочите по дате последнего изменения.Содержимое этого нового столбца определяется значением поля actInvalidation.

Вкратце: как создать временный столбец с целочисленными значениями, затем упорядочить по этому временному столбцу в jpa?

Спасибовы

1 Ответ

0 голосов
/ 31 декабря 2018

Я не проверял это, но должно работать так:

Root<Act> act = query.from(Act.class);

Expression<?> test = builder.selectCase()
                .when(builder.isNull(actRoot.get("actInvalidation")), 1)
                .otherwise(0).as(Integer.class);
Expression<?> actInvalidationPath = actRoot.get("actInvalidation");
Order byInvalidationOrder = builder.asc(actInvalidationPath);

Path<Date> publicationDate = actRoot.get("metadata").get("publicationDate");
Order byLastModificationDate = builder.desc(publicationDate);

Order byTest = builder.asc(test);

query.select(act).orderBy(byTest, byInvalidationOrder, byLastModificationDate);
entityManager.createQuery(query).getResultList();
...