2017-06-22 2 views
0

J'ai une relation Many-To-Many entre Schedule et Agent (via la propriété assignedAgents).API Hibernate + JPA Criteria ne définissant pas les paramètres dans la requête de relation Many-To-Many?

Je souhaite trouver les planifications contenant N'IMPORTE LEQUEL des agents que je fournis. Je suis en train de le faire:

List<Agent> agentsToMatch = // ... I want schedules with any of these agents 

CriteriaBuilder cb = session.getCriteriaBuilder(); 
CriteriaQuery<Schedule> query = cb.createQuery(Schedule.class); 
Root<Schedule> schedule = query.from(Schedule.class); 
query.where(schedule.get(Schedule_.assignedAgents).in(agentsToMatch)); 

En utilisant Hibernate 5.2.7, je reçois la requête suivante lors de la fourniture de 2 agents dans le tableau:

select generatedAlias0 from Schedule as generatedAlias0 where generatedAlias0.assignedAgents in (:param0, :param1) 

Cependant, les paramètres ne pas être défini semblent, comme Je reçois l'exception suivante:

WARN [qtp1782580546-44] o.h.engine.jdbc.spi.SqlExceptionHelper:129 - SQL Error: 0, SQLState: 22023 
ERROR [qtp1782580546-44] o.h.engine.jdbc.spi.SqlExceptionHelper:131 - No value specified for parameter 1. 
javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not extract ResultSet 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) 
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) 
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1419) 
    at org.hibernate.Query.getResultList(Query.java:427) 
    at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:72) 

Toutes les idées où je pourrais aller mal?

Répondre

1

je fixe le problème en remplaçant .get avec .join: Avant:

query.where(schedule.get(Schedule_.assignedAgents).in(agentsToMatch)); 

Après:

query.where(schedule.join(Schedule_.assignedAgents).in(agentsToMatch)); 
0

Manière correcte devrait être

query.where(schedule.get(Schedule_.assignedAgents) 
.in(cb.parameter(List.class, "agentsToMatch"); 

Ensuite vous fournir le paramètre à votre requête

query.setParameter("agentsToMatch", agentsToMatch); 
+0

Merci, mais j'ai toujours le même problème: J'utilise le .setParameter sur la requête Je reçois session.createQuery (requête); Mais hibernate ne semble pas définir la valeur: "Aucune valeur spécifiée pour le paramètre 1." – user2037710

+0

Publiez votre requête complète, s'il vous plaît – fg78nc

+0

CriteriaBuilder cb = session.getCriteriaBuilder(); \t \t CritèreQuery query = cb.createQuery (Schedule.class); \t \t Racine schedule = query.from (Schedule.class); \t \t query.where (schedule.get (Schedule_.assignedAgents) .in (cb.parameter (List.class, "agentsToMatch"))); query.distinct (true); \t \t Requête q = session.createQuery (requête); Q.setParameter ("agentsToMatch", this.agentsToMatch); System.out.println (q.getResultList()); – user2037710