Personnalisation de requêtes
Salut à tous,
Je suis en train de refondre la partie orm d'une application avec JPA et je voulais savoir s'il étais possible de définir des requêtes natives avec @NamedNativeQuery qui pourraient être personnalisées (un peu de la même manière que pour les paramètres -> ?1 ou :param), concrètement je voudrait pouvoir ajouter une clause where (s'il le faut) à ma requête.
Utilisez le concept de JDBC 4.0 pour les NamedQueries
J'ai eu aussi du mal avec les annotations (parametre nome ou pas, unicite du nom, ..) et j'ai finalement reussi a ecrire un Proxy dynamique pour executer les NamedQuery. Le code et la
et le proxy dynamique a cette tete:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
boolean isMultiResults = Collection.class.isAssignableFrom(method.getReturnType());
String queryName;
boolean useNames = useParamNames;
JpaNamedQuery jpaNamedQuery = method.getAnnotation(JpaNamedQuery.class);
if (method.isAnnotationPresent(JpaQueryUseParamNames.class)) {
useNames = true;
}
if (jpaNamedQuery != null) {
queryName = jpaNamedQuery.queryName();
} else {
queryName = prefix + method.getName();
}
Query namedQuery = em.createNamedQuery(queryName);
// TODO: Manage Temporal params
if (useNames) {
if (args != null && args.length > 0) {
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
for (int i = 0; i < args.length; i++) {
String paramName = null;
Annotation[] paramAnnos = parameterAnnotations[i];
for (int j = 0; j < paramAnnos.length; j++) {
Annotation paramAnno = paramAnnos[j];
if (paramAnno instanceof JpaParamName) {
paramName = ((JpaParamName) paramAnno).value();
break;
}
}
if (paramName == null) {
throw new RuntimeException("Parameter " + i + " of method " + method + " does not have the annotation " + JpaParamName.class);
}
namedQuery.setParameter(paramName, args[i]);
}
}
} else {
if (args != null && args.length > 0) {
for (int i = 0; i < args.length; i++) {
namedQuery.setParameter(i + 1, args[i]);
}
}
}
if (isMultiResults) {
return namedQuery.getResultList();
} else {
return namedQuery.getSingleResult();
}
} |
Moi ca m'a beaucoup aide...