-1

为什么这个查询直接在 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 中与精确对应的类型化查询进行 AND:

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

4

2 回答 2

2

您混淆了 SQL(这是 PostgreSQL 所期望的)和 HQL(这是所EntityManager.createQuery()期望的)。

那是两种不同的语言。SQL 与表和列一起使用,而 JPQL 与 JPA 实体、字段/属性和关联一起使用,并由您的 JPA 实现转换为 SQL。

如果要执行 SQL,则必须使用EntityManager.createNativeQuery().

于 2013-10-02T12:37:09.013 回答
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");

并添加订单:

" LEFT OUTER JOIN m.patient p ORDER BY p.surname ASC
于 2013-10-02T13:39:47.907 回答