Hibernate Native Query - как вернуть общее значение из сложного запроса? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть несколько разных сущностей.Допустим, 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

Пожалуйста, я был бы очень признателен за некоторые советы о том, как продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...