Можете ли вы помочь мне создать реализацию построителя критериев на основе этого 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
Конструктор критериев Java ⇐ JAVA
Программисты JAVA общаются здесь
1733737877
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();
Подробнее здесь: [url]https://stackoverflow.com/questions/79255237/java-criteria-builder[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия