2009-11-27 13 views
7

De vez en cuando, obtengo una "org.hibernate.QueryException: ruta de asociación duplicada: myAssociation". Esto se debe a que los criterios complejos con los que estoy trabajando pueden definir la misma ruta en muchos lugares. Me encantaría hacer algo comoObtener criterios por associationPath

Criteria association = myCriteria.getAssociation("wax"); 
if(association == null) association = myCriteria.createCriteria("wax"); 

¿Hay alguna manera de que pueda verificar si una asociación ya está en su lugar?

Saludos

Nik

+0

¿No tendría más sentido utilizar alias únicos en la consulta, en lugar de esperar que el nombre que desea no esté ya ocupado? – skaffman

Respuesta

3

No hay manera de hacerlo a través de la API Criteria. Sin embargo, puede mantener un Map usted mismo si realmente necesita que esto suceda.

Puede:

  • tienen un mapa para cada instancia de criterios, criterios anidados tecleados por alias.
  • tienen un solo mapa global; su clave debería tener tanto el alias de los criterios anidados como la ruta desde el criterio raíz hasta el criterio actual.
+0

Sí, esto es lo que terminé haciendo, solo quedándolos cerca. Sería bueno poder buscarlos, aunque me ahorraría una gran cantidad de pruebas y puestas. :-) – niklassaers

5

Actualmente podría encontrar Subcriterios por alias, pero el código no está publicado (es decir, en la clase CriteriaImpl). Vea mi ejemplo a continuación:

private Subcriteria getCritria(Criteria pCriteria, String pAlias) { 
    Iterator<Subcriteria> iter = ((CriteriaImpl)pCriteria).iterateSubcriteria(); 
    while (iter.hasNext()){ 
     Subcriteria sub = iter.next(); 
     if (pAlias.equals(sub.getAlias())){ 
      return sub; 
     } 
    } 
    return null; 
} 
+2

Excelente solución !! – samz

Cuestiones relacionadas