Hibernate本机查询-如何从复杂查询中返回公共值?

时间:2018-10-02 11:35:00

标签: java oracle hibernate hibernate-native-query

我有几个不同的实体。假设AB,实际上有七个,但这并不相关。这些实体都包含 字段String EntityIdLong RemoteId,但没有任何其他关联(没有父级,在DB端没有外键)。每个实体还具有许多不同的字段。

EntityId在所有实体类型中都是唯一的,因此AB都不会共享entityId-尽管这是在创建过程中由服务器控制的,但不会发生。数据库将允许重复。

现在,我需要一种方法,该方法将基于RemoteId返回实体(AB)的EntityId列表。我通过查找正确的表来完成此操作-将映射EntityId与数据库表配对-然后在字符串生成器中构造查询。

我喜欢

StringBuilder sb = new StringBuilder();
sb.append("SELECT REMOTE_ID FROM ").append(table).append(" WHERE ENTITY_ID = :id");

List<Long> RemoteIds = getEntityManager().createNativeQuery(sb.toString()).setParameter("id",requiredId).getResultList();

这就是我碰到砖墙的地方。通常,在获取实体时,我会在createNativeQuery()中指定实体的类型,但是在这里,我试图获取Longs列表。将Long.class传递给方法时,会弹出一个异常,指出Long是一个未知的休眠实体(显然是这样)。

我显然无法弹出真实的实体类以从中获取RemoteId,因为在运行时之前我不知道该类,并且每个实体都没有RemoteId的父类领域。

以纯Object的形式获取它们也不起作用,因为它以无话可说的异常GenericJDBCException: could not prepare statement结尾(我打印了该语句并试图在数据库本身上运行它)

我也相当确定我可以将方法拆分为七个,每个实体一个,可以在方法内部通过切换并保存为七个变量之一,也可以通过声明七个单独的方法,但这将违反DRY原则,并希望在将来扩展的情况下避免使用它。

此外,数据模型的更改也不成问题,因为这会破坏大多数适配器类和DAO。

我使用Java 8和Oracle 12 DB

请多多指教一些有关如何继续的指示。

0 个答案:

没有答案