2017-01-19 3 views
1

я могу иметь следующий скрипт:Может createNativeQuery из EnityManager вернуть resultClass который додзё класс


1. У меня есть класс сущностей - EntityClass (отображение с EntityTable)
2. У меня есть класс додзё - DojoClass
3. Оба класса имеют одинаковые переменные.

Вопрос:
Что будет возвращен, когда я звоню следующий метод:
A- entityManager.createNativeQuery("SELECT * FROM EntityTable",EntityClass.class);

B- entityManager.createNativeQuery("SELECT * FROM EntityTable",Dojo.class);

Правы ли они?

+0

кто знает, что такое «DojoClass». Возможно, когда вы определите пример, показывающий сам класс ... –

+0

@NeilStockton: Я имею в виду, что DojoClass - это только простой Java-файл с именем: DojoClass.java. Наиболее важным является то, что класс имеет те же переменные с EntityClass. – user3205761

ответ

1

Это довольно необычный случай использования, и я догадываюсь только теоретически.

Я сделал конфигурацию так же, как и у вас, особенно, что обе сущности имеют точно такие же базовые поля (это те, которые будут рассмотрены при сопоставлении результатов с классами).

Я использую JPA 2.1 и Hibernate 5.x в качестве реализации под капотом.

К моему недоумению оба запроса корректно запускаются и присваивают результаты, как ожидалось, соответствующим полям в каждом из классов.

Я пошел немного глубже в реализации и в основном то, что происходит за кулисами:

  • Создание списка типа List<Object[]> в качестве первого шага, который является стандартом поведения для createNativeQuery (String) без указанного класса.
  • Установка полей класса с использованием отражения. Так что это действительно не имеет значения из какой таблицы мы вытягивать результаты .. имена столбцов и типов должны соответствовать ..

И несколько советов для конца:

  • Класса указан в качестве второго параметра должен всегда быть управляемым объектом или встраиваемым
  • Когда я пытался запросить только определенные столбцы, я получал ошибки с отсутствующими столбцами, отсутствующими в запросе. Так что, я думаю, вам всегда нужно выбирать все.

Надеюсь, это прояснит ситуацию.

+0

Если поля класса заданы отражением, я думаю, что он будет работать хорошо, если я выберу определенные столбцы. Колонны, которые я не выбираю, не будут возвращены. Я так думаю :) – user3205761

+0

Thats, что я думал, но я продолжал получать SQLGrammarException, если я не выбрал все сопоставленные столбцы .. возможно, его реализация/версия зависит –