9
votes

JPA 2 et hibernation 3.5.1 membre de la requête ne fonctionne pas

J'essaie la JPQL suivante et elle échoue d'une erreur missuelle:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =  { "/spring/dataLayer.xml"})
@Transactional
@TransactionConfiguration
public class TestUserDaoImplIntegration {
  @PersistenceContext
  private EntityManager em;

  @Test
  public void shouldTest() throws Exception {
    try {
//WORKS
Query query = em.createQuery("SELECT u FROM User u WHERE 'admin' in elements(u.roles)"); 
List users = query.query.getResultList();
    } catch (Exception e) {
      e.printStackTrace();
      throw e;
    }
    try {
//DOES NOT WORK
Query query = em.createQuery("SELECT u FROM User u WHERE 'admin' MEMBER OF u.roles"); 
List users = query.query.getResultList();
    } catch (Exception e) {
      e.printStackTrace();
      throw e;
    }
  }
}


0 commentaires

4 Réponses :


0
votes

Je pense que membre de ne peut pas être utilisé avec un @ElementCollection propriété.


3 commentaires

Il n'y a rien de tel que ça dans la spécification. Membre de est censé fonctionner sur la collecte (et elle le fait) quelle que soit l'annotation utilisée.


Merci pour la correction. Je n'ai pas encore eu la chance d'étudier les spécifications et c'était juste une supposition sauvage.


Il y a tellement de choses qui se trouvent dans la spécification JPA, mais Hibernate ne le supporte tout simplement pas. Comment un serveur d'applications peut-il construire autour de Hibernate jamais certifié Java EE?



10
votes

Votre requête semble parfaitement bien forte> pour moi. Pour l'enregistrement, c'est ce que la spécification JPA 2.0 écrit sur le membre de l'opérateur code>:

4.6.13 Collection EXPRESSIONS MEMBRES H3>

la syntaxe pour l'utilisation de la Opérateur de comparaison membre de code> dans une collection_member_expression est la suivante: p>

<?xml version="1.0" encoding="UTF-8"?>
<persistence
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

  <persistence-unit name="TestPu" transaction-type="RESOURCE_LOCAL">    
    <class>com.stackoverflow.q2688144.User</class>    
    <properties>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:testdb;create=true"/>    
      <property name="eclipselink.target-database" value="DERBY"/>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>


2 commentaires

Merci, je pensais juste que je devais devenir fou.


@Ed_zero Vous n'êtes clairement pas :) Pourriez-vous mettre à jour la question avec un lien avec le problème de la JIRA si vous en créez un? Merci d'avance.



4
votes

Votre requête est absolument correcte et devrait fonctionner. J'ai couru dans ce même problème juste aujourd'hui et, grâce à ce post, a pu arrêter de me frapper la tête contre le mur.

Puisque @ElementCollection est vraiment un joli raccourci vers un élément joint avec une association intrinsèque, vous pouvez toujours utiliser Rejoignez la sémantique dans votre requête.

Pour mettre cela en termes de meilleure qualité, vous devez rejoindre votre collection et définir une condition dans le lieu où.

Pour mettre cela dans quelque chose de plus concret. ..

Votre requête: xxx

peut être écrit comme suit: xxx

espère que cela aide cela aide !


0 commentaires

7
votes

hibernate bug # HHH-5209 , Au fur et à mesure de l'établissement, utilisez la syntaxe suivante:

select user from User user where :role in elements(user.roles)


1 commentaires

Merci pour la solution de contournement ... Pourriez-vous me signaler à la solution de contournement pour l'opérateur vide?