Deze week was ik aangenaam verrast door het interessante artikel over sql queries op de frontpage.
Het schrijven van goede queries is een kunst en verdient inderdaad de nodige aandacht. Maar toch blijf ik me erover verbazen dat velen toch blijven vasthouden aan pure sql of jpql (namedqueries) (toch in de code die ik bekijk, zowel online als van directe collega's) , terwijl er nu mooie (imo) en typesafe oplossingen zijn.
Zo gebruik ik al enige tijd Spring Data Jpa in combinatie met QueryDSL.
Address is in dit voorbeeld een andere tabel, dus de .address() is impliciet een join
.
Dit laat me ook toe om makkelijk aan "paging" te doen, om hapbare lijsten aan de UI voor te schotelen.
Gebruiken jullie gelijkaardige, of misschien zelfs betere frameworks die ik niet ken? Of blijf je liever ver van deze aanpak weg? Waarom dan wel? Zijn er nadelen die ik over het hoofd zie? Of maak ik het allemaal moeilijker dan het zou moeten zijn?
Wat zijn jullie bedenkingen hierover?
Het schrijven van goede queries is een kunst en verdient inderdaad de nodige aandacht. Maar toch blijf ik me erover verbazen dat velen toch blijven vasthouden aan pure sql of jpql (namedqueries) (toch in de code die ik bekijk, zowel online als van directe collega's) , terwijl er nu mooie (imo) en typesafe oplossingen zijn.
Zo gebruik ik al enige tijd Spring Data Jpa in combinatie met QueryDSL.
- Spring data jpa maakt je DAO repositories aan, dit louter aan de hand van een simpele interface die je definieerd (extend de Spring interface met een generics verwijzing naar de entity class die je wil gebruiken). Vervolgens maakt spring deze DAO automatisch aan en zijn default CRUD methodes & paging aanwezig.
- QueryDSL maakt met behulp van classpathscanning (at compiletime) static classes aan van je entities. Deze bevatten al de informatie ivm de persistance (tabellen, kolommen,..). Deze kan je dan gebruiken om heel leesbaar (domain specific language) je queries op te bouwen.
code:
1
2
3
4
5
6
7
| //Spring data jpa repository bean (implementation constructed by spring from provided interface) @Inject PersonRepository personRepository; public List<Person> getPersonsLivingIn(Country country, Set<Postcode> postcodes){ this.personRepository.findAll(QPerson.person.address().postcode.in(postcodes).and(QPerson.person.address().country.eq(country))); } |
Address is in dit voorbeeld een andere tabel, dus de .address() is impliciet een join
Dit laat me ook toe om makkelijk aan "paging" te doen, om hapbare lijsten aan de UI voor te schotelen.
code:
1
2
3
4
5
6
7
8
9
10
11
| { int currentPage = 0; int pageSize = 20; PageRequest firstPageRequest = new PageRequest(currentPage, PageSize, new Sort(Sort.Direction.ASC, "lastName")); Page<Person> firstTwentyPersons = this.getAllPersons(firstPageRequest, new Country("NL")); } public Page<Person> getAllPersons(PageRequest pageRequest, Country country){ this.personRepository.findAll(QPerson.person.address().country.eq(country), pageRequest); } |
Gebruiken jullie gelijkaardige, of misschien zelfs betere frameworks die ik niet ken? Of blijf je liever ver van deze aanpak weg? Waarom dan wel? Zijn er nadelen die ik over het hoofd zie? Of maak ik het allemaal moeilijker dan het zou moeten zijn?
Wat zijn jullie bedenkingen hierover?