为什么此查询直接在postgres数据库上运行:
select m from medicine_case m WHERE m.id IN (select m.id FROM medicine_case m LEFT OUTER JOIN patient ON m.patient=patient.id ORDER BY patient.surname ASC )
在OpenJpa中使用完全对应的类型查询:
String sql = " select m from medicine_case m WHERE m.id IN (select m.id FROM medicine_case m LEFT OUTER JOIN "
+ "patient ON m.patient=patient.id ORDER BY patient.surname ASC )";
TypedQuery<MedicineCase> query = persistenceClient.createQueryMC(sql);
setParameter(query);
query.setFirstResult(first);
query.setMaxResults(count);
给了我:
org.apache.openjpa.persistence.ArgumentException: Encountered "m . id IN ( select m . id FROM medicine_case m LEFT OUTER JOIN patient ON" at character 37, but expected: ["(", ")", "*",.... etc etc
为什么?????它太奇怪了,让我发疯了!
从实体管理器创建查询的代码:
return entityManager.createQuery(sql, MedicineCase.class);
以及执行它的代码:
return query.getResultList().iterator();
答案 0 :(得分:2)
你混淆了SQL(这是PostgreSQL所期望的)和HQL(EntityManager.createQuery()
期望的那样)。
这是两种不同的语言。 SQL与表和列一起使用,而JPQL与JPA实体,字段/属性和关联一起使用,并由JPA实现转换为SQL。
如果要执行SQL,则必须使用EntityManager.createNativeQuery()
。
答案 1 :(得分:0)
在jpql中它变得有点不同:
String sql = "select m from " + MedicineCase.class.getSimpleName() + " m WHERE m.id IN :mcList";
TypedQuery<MedicineCase> query = persistenceClient.createQueryMC(sql);
query.setParameter("mcList", persistenceClient.executeQueryMCId(persistenceClient.createQueryMCId(createSql()
+ addOrders())));
setParameter(query);
query.setFirstResult(first);
query.setMaxResults(count);
return persistenceClient.executeQueryMC(query);
createSql返回的地方:
sql.append("select m.id ").append(" FROM ").append(MedicineCase.class.getSimpleName()).append(" m");
和addOrders:
" LEFT OUTER JOIN m.patient p ORDER BY p.surname ASC