История изменений
Исправление ma1uta, (текущая версия) :
Обычно первое, что находят - это myBatis и Hibernate. Потом оказывается, что есть EclipseLink (который в качестве jpa тоже неплох).
На самом деле jpa (hibernate/eclipselink) генерируют вполне годный sql (конечно, про специфичные штуки каждой СУБД придётся забыть). Но для этого надо понимать, как он генерирует sql и уметь им пользоваться. И да, придётся мириться с тем, что в stacktrace-е будет 5-10 дополнительных вызовов jpa.
Но если уж связался с jpa и без него никак, тогда http://www.querydsl.com очень облегчает жизнь, и позволяет избежать встречи с Criteria API, заменяя запросы примерно на вот такой код:
cats = query.select(catEntity).from(cat)
.innerJoin(mate).on(cat.mateId.eq(mate.id))
.where(cat.dtype.eq("Cat"), mate.dtype.eq("Cat"))
.fetch();
Если можно отказаться от jpa, тогда можно взять jdbi или jOOQ.
Исходная версия ma1uta, :
Обычно первое, что находят - это myBatis и Hibernate. Потом оказывается, что есть EclipseLink (который в качестве jpa тоже неплох).
На самом деле jpa (hibernate/eclipselink) генерируют вполне годный sql (конечно, про специфичные штуки каждой СУБД придётся забыть). Но для этого надо понимать, как он генерирует sql и уметь им пользоваться. И да, придётся мириться с тем, что в stacktrace-е будет 5-10 дополнительных вызовов jpa.
Но если уж связался с jpa и без него никак, тогда http://www.querydsl.com очень облегчает жизнь, и позволяет избежать встречи с Criteria API, заменяя примерно на вот такой код:
cats = query.select(catEntity).from(cat)
.innerJoin(mate).on(cat.mateId.eq(mate.id))
.where(cat.dtype.eq("Cat"), mate.dtype.eq("Cat"))
.fetch();
Если можно отказаться от jpa, тогда можно взять jdbi или jOOQ.