为什么这个OpenJpa的奇怪行为?

时间:2013-10-02 12:12:21

标签: java postgresql openjpa

为什么此查询直接在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();

2 个答案:

答案 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