Выражение конструктора JPQL – org.hibernate.hql.ast.QuerySyntaxException: таблица не отображается

Моя первоначальная проблема заключалась в https://stackoverflow.com/questions/12172614/hql-join-without-foreign-key-reference, но не смогла найти решение для этого, поэтому перешла с использованием собственного запроса с использованием JPA. createNativeQuery объекта entityManager возвращает объект Query, который в свою очередь возвращает List . Я не хочу иметь дело с индексами при повторении списка, потому что это склонность к ошибкам в природе. Поэтому я рассмотрел какое-то другое решение для него и нашел выражения конструктора JPQL как одно из решений.

Структура таблицы

 Schema1 -TableA - NameColumn - PhoneColumn 

Соответствующий class Java

  public class PersonSearch implements Serializable { public PersonSearch (String NameColumn, String PhoneColumn) { this.name = NameColumn; this.phone = PhoneColumn; } private String name; private String phone; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } 

Запрос

  Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PhoneColumn='9134409930' 

при выполнении этого запроса с помощью API сущ.

 entityManager.createQuery(queryString, PersonSearch.class); 

ниже ошибки.

 Caused by: org.hibernate.hql.ast.QuerySyntaxException: Schema1.TableA is not mapped [Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PHONE='9134409930'] 

Что случилось с моим кодом? Есть идеи ?

согласно книге «Pro EJB 3 Java Persistence API»

Выражения конструктора

Более мощная форма предложения SELECT с участием нескольких выражений – это выражение конструктора, которое указывает, что результаты запроса должны храниться с использованием указанного типа объекта. Рассмотрим следующий запрос:

 SELECT NEW example.EmployeeDetails(e.name, e.salary, e.department.name) FROM Employee e 

Тип результата этого запроса – example.EmployeeDetails . По мере того, как процессор запросов выполняет итерацию по результатам запроса, он создает экземпляры EmployeeDetails с использованием конструктора, который соответствует типам выражений, указанным в запросе. В этом случае типы выражений – String, Double и String, поэтому механизм запросов будет искать конструктор с этими типами classов для аргументов. Поэтому каждая строка в полученной коллекции запросов является экземпляром EmployeeDetails содержащим имя сотрудника, зарплату и название отдела.

Тип объекта результата должен быть указан с использованием полного имени объекта. Однако class не должен отображаться в базе данных каким-либо образом. Любой class с конструктором, совместимым с выражениями, указанными в предложении SELECT , может использоваться в выражении конструктора.

Выражения конструктора являются мощными инструментами для построения крупнозернистых объектов передачи данных или объектов просмотра для использования в других уровнях приложений. Вместо того, чтобы вручную создавать эти объекты, можно использовать один запрос для сбора вместе объектов представления, готовых для представления на веб-странице.

Код примера выглядит следующим образом

 List result = em.createQuery("SELECT NEW example.EmpMenu(e.name, e.department.name) " + "FROM Project p JOIN p.employees e " + "WHERE p.name = ?1 " + "ORDER BY e.name").setParameter(1, projectName).getResultList(); 

Класс EmpMenu – это простое pojo, никаких аннотаций, но имеет правильный конструктор, соответствующий выражению конструктора. Результатом является список объектов EmpMenu для каждой возвращаемой строки.

Я считаю, что часть вашего SQL “…. From Schema1.TableA ms ..” должна относиться к объекту, который отображается. Таким образом, вы должны иметь объект, сопоставленный с таблицей A, а затем jpql должен быть чем-то большим по строкам «…. From MyTableAEntity ms …», где MyTableAEntity имеет все соответствующие annotations jpa, сопоставляющие его с таблицей DB TableA. Как говорится в fragmentе книги, цель «SELECT NEW …» не обязательно должна отображаться, но объект, упомянутый в предложении FROM, делает.

Давайте будем гением компьютера.