2009-06-24 12 views
0

Quelle est la bonne méthode pour valider une requête jpa par programmation. Hibernate valide toutes les requêtes nommées basées sur des annotations sur des entités. Mais comment puis-je appeler cette routine de validation sur des requêtes jpa créées par programme, pour vérifier les erreurs?JPA/Hibernate: validation basée sur le code des requêtes jpa

 
@Entity 
public class Foo { 
@Id 
public int id; 

public String name; 

} 
 
main(...) { 
    Query q = getEntityManager().createQuery("select e from " + Foo.class.getName() + " e where e.name = 'x' "); 
    // validate q here 
} 

Répondre

2

Ne pas. L'intégration teste votre code en utilisant une base de données réelle avec le même schéma que votre environnement de production. Pensez-y: si vous créez une requête malformée, c'est un bug de programmation . Qu'allez-vous faire avec l'information? Dites à l'utilisateur qu'une requête JPA est mal formée? Tout ce que vous pouvez faire de façon réaliste est d'enregistrer l'erreur et de dire à l'utilisateur "quelque chose de mal arrivé". Vous saurez qu'il est une requête malformée lorsque vous vérifiez les journaux plus tard de toute façon ...

Modifier

Il pourrait également être utile d'examiner l'appel createQuery() en le nourrissant de mauvaises données - la javadoc here suggère que peut jeter un HibernateException, et je ne suis pas sûr de ce qu'il pourrait faire avec une chaîne autre que de le valider ...

+0

Je veux juste valider mes requêtes générées par programme, tout comme Hibernate le fait pour @namedquery. Si une erreur est trouvée, le programme doit bien sûr s'éteindre. Où je fais le contrôle n'est pas la question ici, le comment est. – H2000

+0

@KlausMeier - si vous regardez ici: https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#createQuery(java.lang.String), vous verrez que le createQuery () peut lancer une exception. Cela pourrait déjà être valide pour vous. Alimenter une requête cassée et voir ce qui se passe? –

0

Soit vous pouvez utiliser createQuery, ou vous devez mettre votre nom de classe tout en écrivant un JPQL.

Questions connexes