Tengo una clase Persona que tiene una colección de alias String que representa los nombres adicionales a los que esa persona puede acceder. Por ejemplo, Clark Kent puede tener alias "Superman" y "Man of Steel". Dwight Howard también tiene un alias de "Superman".¿Es posible obtener el alias SQL de una tabla de unión para una Hibernate sqlRestriction?
@Entity
class Person {
@CollectionOfElements(fetch=FetchType.EAGER)
Set<String> aliases = new TreeSet<String>();
Hibernate crea dos tablas en mi base de datos, Person y Person_aliases. Person_aliases es una tabla de unión con las columnas Person_id y element. Digamos Person_aliases tiene los siguientes datos
--------------------------------
| Person_id | element |
--------------------------------
| Clark Kent | Superman |
| Clark Kent | Man of Steel |
| Dwight Howard | Superman |
| Bruce Wayne | Batman |
--------------------------------
Quiero hacer una consulta Criterios de hibernación para todas las personas que van por el alias de "Superman".
Por razones demasiado largas para enumerarlas aquí, realmente me gustaría hacer de esto una consulta de Criteria, no una consulta HQL (a menos que sea posible agregar una restricción HQL en un objeto Criteria, en cuyo caso soy todo oídos) o una consulta SQL sin formato. Dado que de acuerdo con How do I query for objects with a value in a String collection using Hibernate Criteria? es imposible hacer referencia a los elementos de las colecciones de valores usando el API de Criteria, pensé que recurriría a agregar una SqlRestriction en mi objeto de criterios.
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.sqlRestriction("XXXXX.element='superman'");
con la esperanza de que Hibernate crear una instrucción SQL como
select *
from
Person this_
left outer join
Person_aliases aliases2_
on this_.id=aliases2_.Person_id
where
XXXXX.element='superman'
Sin embargo, tengo que rellenar el XXXXX con el alias de tabla para la tabla Person_aliases en la consulta SQL, que en este caso sería 'aliases2_'. Noté que si necesitaba la referencia al alias de la tabla Person podría usar {alias}. Pero esto no funcionará porque Persona es la tabla principal para este Criterio, no Person_aliases.
¿Qué debo completar para el XXXXX? Si no hay un token de substición agradable como {alias}, ¿hay alguna forma de que pueda hibernar para decirme cuál será ese alias? Noté un método llamado generateAlias () org.hibernate.util.StringHelper class. ¿Esto me ayudaría a predecir cuál sería el alias?
Realmente me gustaría evitar la codificación difícil 'aliases2_'.
¡Gracias por su tiempo!
Gracias por su respuesta: en realidad supe la desafortunada limitación de API de Criteria gracias a una pregunta previa sobre desbordamiento de pila, pero tenía esperanzas de que el uso de un fragmento de SQL nativo mediante sqlRestriction proporcionara un 'truco' que nos permitiera seguir utilizando Criteria. Pero no puedo encontrar una manera de obtener una referencia al nombre de la tabla de unión. Si no hay forma, recurriré a HQL como sugirió. Sin embargo, hay razones que no quiero, que tomarían más espacio del que tengo aquí para explicar (esta pregunta es una representación simplificada de nuestra consulta real) –
@Jason Tal vez es posible, pero * I * no veo cómo sin codificando el nombre de la tabla. –