我有几个不同的实体。假设A
和B
,实际上有七个,但这并不相关。这些实体都包含
字段String EntityId
和Long RemoteId
,但没有任何其他关联(没有父级,在DB端没有外键)。每个实体还具有许多不同的字段。
EntityId
在所有实体类型中都是唯一的,因此A
或B
都不会共享entityId
-尽管这是在创建过程中由服务器控制的,但不会发生。数据库将允许重复。
现在,我需要一种方法,该方法将基于RemoteId
返回实体(A
或B
)的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
请多多指教一些有关如何继续的指示。