Hibernate, кажется, создает неправильный SQL-запрос из HQL Query для оракула диалекта - PullRequest
0 голосов
/ 15 октября 2019

Когда я выполняю простой запрос выбора из HQL, я получаю ОШИБКУ: ORA-00933: команда SQL не завершена должным образом (выберите s1_0.id, s1_0.email, s1_0.first_name, s1_0.last_name от Student как s1_0Я знаю, что проблема, похоже, связана с ключевым словом «as» после имени таблицы, хотя мой HQL-запрос является простым «от ученика», я запутался, откуда происходит добавление ключевого слова.

@Entity
@Table(name="Student")
public class Student {

public Student(){

}

public Student(String firstName, String lastName, String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
}

@GenericGenerator(
        name = "studentSequenceGenerator",
        strategy = 
 "org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters = {
                @Parameter(name = "sequence_name", value = "STUDENT_SEQ"),
                @Parameter(name = "initial_value", value = "1"),
                @Parameter(name = "increment_size", value = "1")
        }
)

@Id
@Column(name="id")
@GeneratedValue(generator = "studentSequenceGenerator")
private Long id;

@Column(name="first_name")
private String firstName;

@Column(name="last_name")
private String lastName;

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

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

@Override
public String toString() {
    return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]";
}

}

SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Student.class).buildSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
List<Student> std = (List<Student>)session.createQuery("from Student").getResultList();
session.getTransaction().commit();
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
Hibernate: select s1_0.id, s1_0.email, s1_0.first_name, s1_0.last_name from Student as s1_0
Oct 15, 2019 3:01:18 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 933, SQLState: 42000
Oct 15, 2019 3:01:18 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-00933: SQL command not properly ended

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: JDBC exception executing SQL [select s1_0.id, s1_0.email, s1_0.first_name, s1_0.last_name from Student as s1_0]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
    at org.hibernate.query.internal.AbstractQuery.list(AbstractQuery.java:1311)
    at org.hibernate.query.internal.AbstractQuery.getSingleResult(AbstractQuery.java:1328)
    at com.hibernate.demo.ReadStudentDemo.main(ReadStudentDemo.java:29)
Caused by: org.hibernate.exception.SQLGrammarException: JDBC exception executing SQL [select s1_0.id, s1_0.email, s1_0.first_name, s1_0.last_name from Student as s1_0]
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
    at org.hibernate.sql.results.internal.values.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:103)
    at org.hibernate.sql.results.internal.values.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:54)
    at org.hibernate.sql.results.internal.values.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:110)
    at org.hibernate.sql.results.internal.values.AbstractJdbcValues.next(AbstractJdbcValues.java:32)
    at org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:72)
    at org.hibernate.sql.exec.internal.ListResultsConsumer.consume(ListResultsConsumer.java:57)
    at org.hibernate.sql.exec.internal.ListResultsConsumer.consume(ListResultsConsumer.java:24)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:191)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:68)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:167)
    at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:242)
    at org.hibernate.query.internal.AbstractQuery.list(AbstractQuery.java:1302)
    ... 2 more
Caused by: java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1052)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:537)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:255)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:610)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:253)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:86)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:765)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:921)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1099)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3640)
    at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1384)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3687)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165)
    at org.hibernate.sql.results.internal.values.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:98)
    ... 13 more
Caused by: Error : 933, Position : 73, Sql = select s1_0.id, s1_0.email, s1_0.first_name, s1_0.last_name from Student as s1_0, OriginalSql = select s1_0.id, s1_0.email, s1_0.first_name, s1_0.last_name from Student as s1_0, Error Msg = ORA-00933: SQL command not properly ended

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498)
    ... 28 more
Oct 15, 2019 3:01:18 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Проблема заключалась в разработке jiber-ов ORM для разработки после замены этих Jars стабильной версией. Все прошло гладко. Кроме того, эта помощь форума определила проблему https://forum.hibernate.org/viewtopic.php?p=2340268

0 голосов
/ 15 октября 2019

Можете ли вы попробовать

List<Student> students = session.createQuery("SELECT a FROM Student a", Student.class).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...