2017-06-22 44 views
0

我有Schedule和Agent之間的多對多關係(通過屬性assignedAgent)。Hibernate + JPA Criteria API在多對多關係查詢中沒有設置參數?

我想找到包含我提供的任何代理的計劃。我試圖做到這一點:

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)); 

使用Hibernate 5.2.7,在陣列中提供2劑,當我得到以下查詢:

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

然而,參數似乎沒有進行設置,如我得到以下例外:

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) 

任何想法,我可能會出錯?

回答

1

我用。加入替換不用彷徨解決了這一問題: 前:

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

之後:

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

正確的方法應該是

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

然後你提供參數查詢

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

謝謝,但不知何故,我仍然有同樣的問題:我在查詢上使用session.createQuery(查詢)上的.setParameter;但hibernate似乎沒有設置值:「沒有爲參數1指定值」。 – user2037710

+0

請發送您的完整查詢,請 – fg78nc

+0

CriteriaBuilder cb = session.getCriteriaBuilder(); \t \t CriteriaQuery query = cb.createQuery(Schedule.class); \t \t 根 schedule = query.from(Schedule.class); (schedule.get(Schedule_.assignedAgents).in(cb.parameter(List.class,「agentsToMatch」))); query.distinct(true); \t \t 查詢 q = session.createQuery(query); q.setParameter(「agentsToMatch」,this.agentsToMatch); System.out.println(q.getResultList()); – user2037710