2010-11-20 18 views
4

Connaissez-vous un moyen d'implémenter quelque chose comme un Hibernate QBE (requête par exemple) dans JPA? Pour mon domaine de problème, l'alternative de l'utiliser sera de construire une requête SQL dynamiquement en utilisant une sorte de manipulation de chaîne, quelque chose que je voudrais éviter. Je sais que ceci n'est pas supporté par défaut dans l'API, mais je le reconnais comme une excellente technique pour construire des requêtes dynamiques.Implémentation de la fonctionnalité de requête par exemple dans JPA

Des suggestions?

Répondre

8

Dans JPA 2.0, l'équivalent le plus proche est appelé API de critères. Il n'existait pas dans JPA 1.0.

Voici un exemple:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery c = cb.createQuery(Person.class); 
Root person = c.from(Person.class); 
c.select(person) 
    .where(cb.equal(person.get("name"), "Officer Friendly")); 
+0

Merci beaucoup pour l'exemple, c'est la chose, je n'utilise pas JPA 2.0 mais 1.0 –

+2

L'un des principaux avantages de FindByExample est que vous êtes libre de refactoriser l'entité sans avoir à vous soucier de briser les requêtes qui reposent sur FindByExample. Dans cet exemple, vous voyez que si la personne "name" est refactorisée en la divisant en "firstName" et "lastName", la requête sera brisée. –

9

QBE n'est pas disponible dans JPA 1.0 ou 2.0. Pour plus de détails, voir here

+1

Je pense que c'est la bonne réponse, mais malheureusement, il est entre les mains de l'OP de choisir celui de droite. J'ai voté pour le vôtre. –

0

Il y a longtemps que je devais gratter que ich et moi avons décidé de le faire moi-même.

vous pouvez l'obtenir à SourceForge: svn: //svn.code.sf.net/p/jpaco/code/ jpaco code

1

J'étais face à ce même problème un certain temps. J'ai trouvé que l'utilisation de l'API JPA Criteria était un peu lourde, j'ai donc décidé de faire une abstraction en plus.

Il est une petite bibliothèque, flexible et simple: https://github.com/kenglxn/QueryByExample

Espérons que cela peut être utile pour les autres avec cette même question.

Le cas de test a plusieurs exemples pratiques: https://github.com/kenglxn/QueryByExample/blob/master/src/test/java/net/glxn/qbe/QBETest.java

+0

Les entités ayant des propriétés de collection seront-elles également prises en charge? Que diriez-vous des propriétés avec un graphique plus profond? –

+0

pas actuellement, mais ne hésitez pas à poster un problème sur github. – kenglxn