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; } } }
4 Réponses :
Je pense que membre de code> ne peut pas être utilisé avec un
@ElementCollection code> propriété. p>
Il n'y a rien de tel que ça dans la spécification. Membre de code> 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?
Votre requête semble la syntaxe pour l'utilisation de la
Opérateur de comparaison de l'opérateur code>:
4.6.13 Collection EXPRESSIONS MEMBRES H3>
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>
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.
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. P>
Pour mettre cela en termes de meilleure qualité, vous devez rejoindre votre collection et définir une condition dans le lieu où. P>
Pour mettre cela dans quelque chose de plus concret. .. p>
Votre requête: p> peut être écrit comme suit: p> espère que cela aide cela aide ! p> p>
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)
Merci pour la solution de contournement ... Pourriez-vous me signaler à la solution de contournement pour l'opérateur vide?