org.hibernate.QueryException: не удалось разрешить свойство: запрос: abc.def.mypackage.orm.Employee

Я получаю следующую ошибку, когда пытаюсь выполнить метод insertEmployeeDetails:

org.hibernate.QueryException: не удалось разрешить свойство: запрос: abc.def.mypackage.orm.Employee [ВСТАВИТЬ В Сотрудник (имя, определение, (ВЫБЕРИТЕ value_emp_id ИЗ COMPANY_DATA, ГДЕ testing_id = 1234 AND company_employee_id = 3345))]

Глядя на аналогичные онлайн-сообщения о переполнении стека, скажем, например, следующее:

org.hibernate.QueryException: не удалось разрешить свойство:

что «мы не ссылаемся на имена столбцов базы данных, вместо этого мы ссылаемся на имена свойств». Поэтому я четко упомянул name и definition, как они определены в классе сущностей Employee ниже. . Подзапрос, в котором я пытаюсь получить значение столбца COLUMN_ID, использует подзапрос, поэтому я не уверен, смогу ли я использовать что-то в соответствии с правилами HQL? Я имею в виду подзапрос SELECT, который должен извлекать value_emp_id из COMPANY_DATA table — это SQL-запрос, о котором я упоминал. Это нужно модифицировать? Может ли это быть причиной такой ошибки? Пожалуйста, порекомендуйте.

Мой класс сущностей Employee.java выглядит следующим образом:

package abc.def.mypackage.orm

@Entity
@Table(name = "EMPLOYEE")
public class Employee {
 public int getEmployeeId() {
  return employeeId;
 }

 public void setEmployeeId(int employeeId) {
  this.employeeId = employeeId;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getIsCorrect() {
  return isCorrect;
 }

 public void setIsCorrect(int isCorrect) {
  this.isCorrect = isCorrect;
 }

 public int getIsWrong() {
  return isWrong;
 }

 public void setIsWrong(int isWrong) {
  this.isWrong = isWrong;
 }

 public int getCompanyId() {
  return companyId;
 }

 public void setCompanyId(int companyId) {
  this.companyId = companyId;
 }

 public Integer getTransactionId() {
  return transactionId;
 }

 public void setTransactionId(Integer transactionId) {
 this.transactionId = transactionId;
 }

 public String getDefinition() {
  return definition;
 }

 public void setDefinition(String definition) {
  this.definition = definition;
 }

 @Id
 @Column(name = "EMPLOYEE_ID")
 @GeneratedValue(strategy = GenerationType.AUTO, generator = "seqgen")
 @SequenceGenerator(name = "seqgen", sequenceName = "EMPLOYEE_AUTOINC_SEQ")
 private int employeeId;

 @Column(name = "NAME")
 private String name;

 @Column(name = "DEFINITION")
 private String definition;

 @Column(name = "IS_CORRECT")
 private int isCorrect;

 @Column(name = "IS_WRONG")
 private int isWrong;

 @Column(name = "COMPANY_ID")
 private int companyId;

 @Column(name = "TRANSACTION_ID", nullable = true)
 private Integer transactionId;


}

Вот как я использую HQL в своем методе:

public boolean insertEmployeeDetails(Employee employee)
    {
        logger.debug("Starting EmployeeDaoImpl.insert()  .....");
        Session session = null;
        Transaction tx = null;
        boolean status = true;
        try {
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            String hqlInsert = "INSERT INTO Employee (name,definition,"
                    + "( SELECT value_emp_id FROM COMPANY_DATA WHERE testing_id = 1234 AND"
                    + " company_employee_id = 3345))";

            int createdEntities = session.createQuery( hqlInsert )
                    .executeUpdate();

            session.persist(employee);
            tx.commit();
            System.out.println("Checking for hqlInsert");
            System.out.println(hqlInsert);

            System.out.println("Checking for CreatedEntities");
            System.out.println(createdEntities);
        } catch(Exception ex) {
            tx.rollback();
            ex.printStackTrace();
            status = false;
        } finally {
            session.close();
        }
        logger.debug("Completed EmployeeDaoImpl.insert()  .....");
        return status;
    }

person Dan    schedule 02.10.2017    source источник
comment
Да, у меня возникли другие проблемы с моим SQL-запросом после использования вашего подхода, для которого я создаю новый пост. Спасибо за ответ.   -  person Dan    schedule 03.10.2017
comment
Хорошо, я буду рад помочь вам и с этим новым выпуском.   -  person cнŝdk    schedule 03.10.2017


Ответы (1)


Проблема здесь в том, что вы путаете createQuery() с createSQLQuery(), потому что createQuery() выполняет запрос HQL, а не запрос SQL, как вы можете видеть в документации:

создать запрос

Создайте новый экземпляр запроса для заданной строки запроса HQL.

На самом деле запрос hqlInsert string, который вы передали методу createQuery(), является запросом на вставку SQL, который не поддерживается createQuery(), вам нужно использовать createSQLQuery(), чтобы вы могли выполнить его с Hibernate, и убедитесь, что для него используются столбцы базы данных вместо атрибутов Entity. так как это SQL-запрос.

person cнŝdk    schedule 02.10.2017