Конструктор критериев JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Конструктор критериев Java

Сообщение Anonymous »

Можете ли вы помочь мне создать реализацию построителя критериев на основе этого SQL?
SELECT a.*
FROM
MY_TABLE a
INNER JOIN (
SELECT

ELL_ID,
STATUS,
MAX(COALESCE(MOD_DATE, CREA_DATE)) AS MAX_DATE
FROM
MY_TABLE b
GROUP BY ELL_ID, STATUS
) b

ON
a.ELL_ID = b.ELL_ID
AND a.STATUS = b.STATUS
AND COALESCE(a.MOD_DATE, a.CREA_DATE) = b.MAX_DATE
WHERE a.MOD_DATE >= TO_DATE('2024.12.01', 'YYYY.MM:DD');


Я пробовал много реализаций, но у меня нет хорошей идеи.
К сожалению, мне не удалось реализовать группу по выражению в подзапросе.
И вот моя реализация:
CriteriaQuery statusMainQuery = criteriaBuilder.createQuery(MyTableEntity.class);
Root status = statusMainQuery.from(MyTableEntity.class);

List predicates = new ArrayList();
if (searchDto.getStatusChange() != null) {
predicates.add(criteriaBuilder.equal(status.get("status"), searchDto.getStatusChange()));
}
if (searchDto.getStatusChangeDate() != null) {
List creaDatePredicates = new ArrayList();
creaDatePredicates.add(criteriaBuilder.isNull(status.get("modDate")));
creaDatePredicates.addAll(
CriteriaPredicateHelper.getCriteriaFilterDateValue(
status, "creaDate", searchDto.getStatusChangeDate(),
criteriaBuilder, true, LocalDateType.LOCALDATETIME));
predicates.add(
criteriaBuilder.or(
criteriaBuilder.and(creaDatePredicates.toArray(new Predicate[0])),
criteriaBuilder.and(
CriteriaPredicateHelper.getCriteriaFilterDateValue(
status, "modDate", searchDto.getStatusChangeDate(),
criteriaBuilder, true, LocalDateType.LOCALDATETIME).toArray(new Predicate[0])
)
)
);
}

Subquery subquery = statusMainQuery.subquery(Object[].class);
Root subRoot = subquery.from(MyTableEntity.class);
Expression maxDateExpression = criteriaBuilder.greatest(criteriaBuilder.coalesce(subRoot.get("modDate"), subRoot.get("creaDate")));
/* This is not working
Expression selection = criteriaBuilder.array(
subRoot.get("ellId"),
subRoot.get("status"),
maxDateExpression
);
subquery.select(selection)
.groupBy(subRoot.get("ellId"), subRoot.get("status"));
*/
List entities = entityManager.createQuery(statusMainQuery).getResultList();


Подробнее здесь: https://stackoverflow.com/questions/792 ... ia-builder
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»