2016-08-22 2 views
1

Я использую Java 8 с JPA/Hibernate 5.2.1 и базу данных MySQL.MySQLSyntaxErrorException: Неизвестный столбец xxx в 'списке полей'

Таблицы:

+--------+ +----------------+ +----------+ 
| Rating | | Rating_Employee| | Employee | 
+--------+ +----------------+ +----------+ 
| ID  | | RAT_ID   | | ID  | 
| REVIEW | | EMP_ID   | +----------+ 
+--------+ +----------------+  

Я пытаюсь сохранить строку в Rating таблицы, но получаю следующее:

MySQLSyntaxErrorException: Unknown column 'employee0_.distance' in 'field list' 

Причина потому, что модель объекта Employee имеет DISTANCE поле, но не соответствующий столбец в базе данных. Мне нужно поле DISTANCE, потому что, когда я делаю SELECT в таблице Employee, я вычисляю DISTANCE на основе других столбцов с nativeQuery. Однако, когда Hibernate делает сам выбор при обновлении объединенной таблицы RATING, он хочет соответствовать DISTANCE, который не существует (я получаю вышеуказанную ошибку).

Когда я persist или merge объект Employee, я использую следующие успешно:

@Column(insertable=false, updatable=false) 
private BigDecimal distance; 

Вопрос:

Как получить спящий режим игнорировать DISTANCE при выполнении нон родной запрос select ? (Когда он обновляет RATING таблицу)

UPDATE

мне посоветовали возможно использовать @Formula("..."), но мой метод имеет довольно сложный nativeQuery, который также заказ по distance. Если я положу формулу в @Formula("..."), ей также нужно будет получить параметры, переданные в данный момент методу.

Любые идеи?

+0

Вы можете использовать столбец Hibernate @Formula для получения расстояния с помощью нативного запроса SQL: http://stackoverflow.com/questions/2986318/calculated-property-with-jpa-hibernate –

+0

Спасибо Алан, я посмотрим. – Richard

+0

Привет, Алан, моя проблема с использованием '@ Formula', заключается в том, что мне нужно заказать результирующий набор на' distance'. Я не могу получить его и сортировать в java, потому что я получаю только ограниченное количество строк за раз. У тебя есть идеи? Можно ли «упорядочить» столбец '@ Formula'? – Richard

ответ

1

Спящий режим игнорирует поля, аннотированные @Transient. Таким образом, вы можете использовать эту опцию, чтобы сделать поле «расстояние» не управляется Hibernate

@Transient 
private BigDecimal distance; 

из Java документ: http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html

+0

Привет, SEY_91, спасибо, но '@ Transient' обычно работает, но мне нужно сделать это динамически. Когда я делаю 'select' (' nativeQuery') в таблице Emplyee, мне нужно поле 'distance'. Поэтому я не могу просто сделать это '@ Transient'. – Richard

+0

Если вы имеете в виду под «полем расстояния только для собственного запроса», который вы хотите получить «столбец расстояния», созданный при спящем режиме, создающий схему, и после этого он не будет отображаться по запросу спящего режима. то вы можете вручную создать столбец «расстояние», потому что делать это динамически (во время выполнения, игнорируя определенные поля) невозможно. –

+0

Да, я думаю, что я собираюсь написать собственный запрос, чтобы сделать INSERT. – Richard

0

Мое решение:

Я делаю второй объект Employee, который делает нет есть @Transient сверху. Затем я использую это и копирую его в объект Employee.

List<Employee> employees = new <Employee>ArrayList(); 
List<EmployeeWithDistance> employeesWD = (List<EmployeeWithDistance>) q.getResultList(); 
for (EmployeeWithDistance employeeWD : employeesWD) { 
    Employee employee = new Employee(); 
    BeanUtils.copyProperties(employeeWD, employee); 
    employees.add(employee); 
} 
return employees; 
Смежные вопросы