java - relanzar - Hibernación e inesperado fin de la excepción del Subárbol
relanzar excepciones java (4)
Al buscar en Google, parece que tu colección de parámetros puede estar vacía. Agregaría un cheque vacío antes de llamar a la consulta.
La lección es que Google es tu amigo. Cuando no puede encontrar un mensaje de error, intente escribirlo en Google (o en su motor favorito). Es poco probable que sea la primera persona confundida.
Soy un novato en Hibernate.
Tengo un Item
POJO que contiene un Set<String>
consiste en etiquetas. Las etiquetas están contenidas en otra tabla de base de datos de la tabla de Item
, por lo que hago un join para rellenar el pojo.
Estoy tratando de ejecutar una consulta de ejemplo simple del libro "Persistencia de Java con Hibernate" donde from Item item where ''hello'' member of item.labels
. Solo que, por alguna razón, estoy obteniendo un
`org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree[from /*qualified class path*/.Item item where ''hello'' member of item.labels]`
¿Qué podría estar causando este problema?
Aquí están mis POJOs:
public class Item
private int uuid;
private Set<String>labels = new HashSet<String>();
@Id
public int getUuid(){
return uuid;
}
@CollectionOfElements
@JoinTable(name="labels", joinColumns=@JoinColumn(name="uuid"))
@Column(name="label")
public Set<String> getLabels(){
return labels;
}
}
El miembro de comando en el HQL está reservado para el uso de objetos no primitivos. Hay dos cosas que puedes hacer. Puede crear una SQLQuery
siguiente manera:
SQLQuery sQuery = session.createSQLQuery("select *
from item_table it
inner join label_table lt
where it.id = lt.item_id
and lt.label = ''hello''");
sQuery.list();
O puede crear una clase llamada Label
y hacer lo siguiente en su HQL:
from Item item, Label label
where label member of item.labels
and label.label = ''hello''
Espero que esto ayude :)
Para las colecciones primitivas, debe usar la consulta HQL así:
from Item item join item.labels lbls where ''hello'' in (lbls)
PD: se requiere ''join'' porque ''labels'' es OneToMany o ManyToMany variant, se requieren paréntesis porque ''lbls'' es una colección
En base a los comentarios sobre el error HHH-5209 , que es la misma excepción que se arrojó de una consulta JPQL similar, creo que la forma correcta aquí es:
select item from Item item where ''hello'' in elements(item.labels)
Los elements
funcionan allí es la clave. Esto es quizás un poco más simple que la sugerencia de Yuri, porque evita la unión explícita.