2011-02-02 10 views
14

¿Alguien sabe si y cómo la solución para following question (que está escrita en la API de JPA) puede escribirse utilizando la API de criterios de hibernación?ElementCollection createAlias ​​in hibernate API

Para ser más específicos Tengo una entidad de discusión que contiene una lista de participantes (que es una lista de nombres de usuario):

@ElementCollection 
@Column(name = "user_name") 
@CollectionTable(name = "DISCUSSION_USER", joinColumns = @JoinColumn(name = "DISCUSSION_ID")) 
@OrderColumn(name = "ORDER_INDEX") 
private List<String> participants = new ArrayList<String>(); 

ahora tengo que recuperar todas las discusiones donde un determinado nombre de usuario es un participante.

Si yo hubiera creado una entidad participante para esto sería sencillo:

Criteria crit = getSession().createCriteria(Discussion.class); 
    crit.createAlias("participants", "p"); 
    crit.add(Restrictions.eq("p.userName", portalUsername)); 

Pero no puede crear un alias con una entidad no ...

Respuesta

2

Como se explica here lo que quería no es posible:

Las limitaciones del uso de un ElementCollection en lugar de un OneToMany es que los objetos de destino no pueden ser consultado, persistido, fusionado independientemente de su objeto principal. Son objetos estrictamente de propiedad privada (dependientes), lo mismo que un mapeo incrustado. No hay una opción de cascada en ElementCollection, los objetos de destino siempre se conservan, se fusionan y se eliminan con sus padres.

Así que usé OneToMany en su lugar.

1

Puede darnos una mayor completar el esquema y la consulta?

Además, Criteria API es una mierda. Trate de usar QueryDSL, la consulta podría ser:

HibernateQuery q=new HibernateQuery(getSession()) 
.from(QDiscussion.discussion).from(QDocument.document) 
.where(QDocument.document.userName.in(QDiscussion.discussion.userNames)) 
.list(QDocument.document); 
24

Última respuesta.

El propertyName correcta para la recolección (anotado por @ElementCollection) es "elements" o constante CollectionPropertyNames#COLLECTION_ELEMENTS.

Pruebe con las siguientes respuestas

Criteria crit = getSession().createCriteria(Discussion.class); 
crit.createAlias("participants", "p"); 

crit.add(Restrictions.eq("p.elements", portalUsername)); 

o utilizar las constantes COLLECTION_ELEMENTS lugar

crit.add(Restrictions.eq("p." + CollectionPropertyNames.COLLECTION_ELEMENTS, portalUsername)); 
+1

nunca es demasiado tarde para una buena respuesta, voy a estar seguro de probar esto de una vez –

+0

este momento no funcionó ... maldición .... Pero estoy usando una versión muy antigua, puede ser que esto se haya solucionado en las versiones más nuevas .. – Thihara

+0

Parece que por el uso de estas constantes en el código fuente de Hibernate, estas son para Consultas HQL solamente. –

Cuestiones relacionadas