LINUX.ORG.RU

Выполнение сложных отчётов на стеке Spring

 ,


0

1

Какая общепринятая практика выполения сложных отчётов (большие запросы с оконными функциями, case'ами и прочим) на стеке Spring? Грубо говоря это raw sql с data bindings. Не хочется городить много DTO и переносить это на плечи JPA. JdbcTemplate или есть лучше способы?

jdbcTemplate / DSL (jOOQ, QueryDSL)

bvn13 ★★★★★
()

Грубо говоря это raw sql с data bindings.

Mybatis

anonymous
()

У меня это сделано на JdbcTemplate. Я написал небольшой helper который позволяет это потом размапить в объекты, по сути каждый объект имеет Builder в себе и умеет выкровырять свой столбцы из ResultSet по префиксу имени столбца. Получается, что если у меня сложный объект то я вызываю его builder и в нем допустим есть объект user, тогда самый внешний builder ожидает в ResultSet столбцы с перфиксом «user» и вызывает Builder user-а с указанием ему префикса который маппить и так по цепочке. Кода на самом деле не оч много писать, просто Builder-а для каждого объекта.

Но вообще Hibernate решает конечно, у меня вот такой пример есть в проекте на работе:

Есть сущность UserCounter где хранится дата, id юзера и счетчик. Хотим показывать аггрегаты за последний 24 часа, для этого есть класс AggregateCounter и вот такой вот hql:

select new AggregateCounter(c.user, max(c.date), sum(c.count))
from UserCounter c
where c.date > :deadline
group by c.user
order by c.date desc

Ну и deadline параметр потом - дата 24 часа назад.
Выплевывает мне мои AggregateCounter-ы на ура.

Еще есть MyBatis и Jooq. MyBatis - геморрой, jooq - не пробовал.
DiKeert ★★
()
Ответ на: комментарий от DiKeert

О, а еще если берешь Hibernate или JPA, но можешь написать нативные запрос и потом пихнуть его в аннотации на свой класс и добавить SqlResultSetMapping (https://docs.oracle.com/javaee/5/api/javax/persistence/SqlResultSetMapping.html) что бы показать как его маппить

DiKeert ★★
()

Я свалил на ноду так и не решив этой проблемы. Обмазался всякими велосипедами для массивов однотипных объектов, мне норм. ORM тут не нужны, js сам по себе, как orm. Гоняю json'ы через rabbitMQ, кайфую.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от DiKeert

Еще есть MyBatis и Jooq. MyBatis - геморрой, jooq - не пробовал.

Вот тот сценарий который указал ТС как раз mybatis должен подойти, скорее всего sql сложный, пихать большие запросы в java файлы не удобно, потому как язык java не умеет мультилайн строки, в итоге при правке большого sql его приходится выковыривать, затем форматировать внешним тулом (dbeaver, sqldeveloper, etc) и только потом можно править. А вот mybatis позволит rawsql впихнуть в xml как есть, с сохранением формата, да еще он умеет биндить результат к объекту.

jooq тоже не просто использовать, хотя бы из-за того что нужно настраивать генератор классов отображающих структуру таблиц, без него неудобно работать.

anonymous
()
Ответ на: комментарий от crutch_master

Кстати оч верный ответ, только clojure какой-нибудь вместо ноды и будут вкусненькие мапы из запросов вылетать.

DiKeert ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.