У меня есть несколько разных сущностей.Допустим, A
и B
, на самом деле их семь, но это не имеет значения.Все эти объекты содержат поля String EntityId
и Long RemoteId
, но никак не связаны между собой (без родителей, без внешних ключей на стороне БД).Каждая сущность также имеет много разных полей.
EntityId
уникален для всех типов сущностей, поэтому не может быть, чтобы и A
, или B
имели общий entityId
, хотя это контролируется на сервере во время создания.DB допускает дубликаты.
Теперь мне нужен метод, который будет возвращать список RemoteId
s для сущности (либо 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()
, но здесь я пытаюсь получить List of Longs.При передаче Long.class
методу появляется исключение, сообщающее, что Long
является неизвестной спящей сущностью (что, очевидно, так и есть).
Я, очевидно, не могу заглянуть в класс реальной сущности, чтобы получить RemoteId
из этого, потому что я не знаю класс до времени выполнения, и нет родительского класса для каждого из них, который имел бы поле RemoteId
.
Получение их как простого Object
также не работает, поскольку заканчивается ничем не говорящим исключением GenericJDBCException: could not prepare statement
(И я распечатал оператор и попытался запустить его на самой БД)
Я также вполне уверен, что мог бы разделить метод на семь, по одному для каждой сущности, либо внутри метода путем переключения и сохранить в одну из семи переменных, либо объявив семь отдельных методов, но это как бы нарушает принцип СУХОЙ ихотел бы избежать этого, в случае будущего расширения.
Кроме того, об изменении модели данных не может быть и речи, поскольку это нарушит большинство классов адаптеров и DAO.
Я использую Java 8 и Oracle 12 DB
Пожалуйста, я был бы очень признателен за некоторые советы о том, как продолжить.