OpenJPA:JPQL 与本机查询

Posted

技术标签:

【中文标题】OpenJPA:JPQL 与本机查询【英文标题】:OpenJPA:JPQL vs native query 【发布时间】:2016-03-20 02:52:16 【问题描述】:

我在工作中使用 OpenJPA。 有时我必须使用 JPQL,有时我必须使用本机查询(em.createNativQuery)。

我正在目睹原生查询的一个大问题。我也必须提供架构名称。

喜欢 JPQL 我可以写:

em.createQuery("Select e from Entity_name e").getResultList();

但如果是本地查询,我需要这样做:

em.createNativeQuery("Select e from SCHEMANAME.Table_name e").getResultList()

为什么会这样?这不是错误的行为,因为模式名称可能会随时间变化。

【问题讨论】:

【参考方案1】:

尝试在您的配置中指定以下属性。

<property name="openjpa.jdbc.Schema" value="SCHEMANAME"/>

如果您同时使用 JPQL 和本机查询,请尝试按如下方式添加实际实体。

例如 Query query = em.createNativeQuery("SELECT * FROM MAG", Magazine.class);

否则您可能会遇到数据不一致问题,例如脏读、丢失更新等

更新

Query createNativeQuery(java.lang.String sqlString,
                        java.lang.Class resultClass)

创建一个 Query 实例以执行本机 SQL 查询。

参数:sqlString - 原生 SQL 查询字符串

resultClass - 结果实例的类

希望这会有所帮助。

【讨论】:

@Mandroid :您是否尝试按照我的答案的示例中所示传递实例类? 嗨 Tharindu,我没有那样做。其实我的SQL字符串有2个不同的表,这种情况怎么处理? @Mandroid :我已经更新了答案。实体应该是结果对应的实体。 @Mandroid:对你有用吗?你是怎么解决的?

以上是关于OpenJPA:JPQL 与本机查询的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenJPA 中使用 inet postgres 数据类型

OpenJPA - 实例的 id 字段在查询时返回 null

OpenJPA 查询验证错误

OpenJPA 查询何时执行以及啥是顺序

如何防止 OpenJPA 替换查询中的“常量”参数? [复制]

使用 openJPA 持久化更新查询