W Springu JPA zwykle używa się przy użyciu Spring Data (przecież nie będziesz używał czystego EntityManagera)?
Z rozwiązań typowo SQL oriented moje ulubione to jOOQ (szczególnie fajne, gdy chcesz pisać type-safe zapytania dynamiczne np. w zależności od parametrów jest różne WHERE). Cechą jOOQ (czy wadą czy zaletą to dyskusyjne) jest konieczność wygenerowania klas na potrzeby DSL na podstawie istniejącego schmatu bazy.
Nie zapominaj też o zupełnie wystarczającym JDBC Template. Ciekawym dodatkiem jaki jakiś czas temu testowałem jest biblioteka Spring Data JDBC template nieco redukująca prosty CRUD dla czystego JDBC (implementuje podstawowowe interfejsy SpringData tzn. CrudRepository, PagingAndSortingRepository):
https://github.com/jirutka/spring-data-jdbc-repository
Niestety, nie masz wsparcia dla dynamicznych zapytań Spring Data w stylu findPersonBySurname: dużo kodu do naklepania, niestety. Jak chcesz mieć autouzupełnianie trywialnych zapytań idź w Spring Data JPA. Ale stwórz sobie dodatkową warstwę abstrakcji, tak aby w kodzie biznesowych pracować na niemutowalnych obiektach.
Nie jestem fanem baz embedded: mogą zachowywać się zupełnie inaczej jak produkcyjna baza. Jak ktoś używa czystego ORM powinno być spoko, jak pojawi się jakaś cecha związana z silnikiem np. przydatna funkcja SQL to może nie być kompatybilne i test mocno rozminie się z rzeczywistością.