could not extract ResultSet при удалении пользователя

Рейтинг: -2Ответов: 2Опубликовано: 10.07.2023

Задача: написать программу на java для коннекта с БД mysql использую hibernate

Создание класса пользователей, которые нужно помещать в таблицу: (геттеры сеттеры не пишу, формируются идеей)

import javax.persistence.*;

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

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

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

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

@Column(name = "age")
private Byte age;

public User() {

}

public User(String name, String lastName, Byte age) {
    this.name = name;
    this.lastName = lastName;
    this.age = age;
}

Создание коннекта с БД делается отдельным классом:

public class Util {
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        try {
            Configuration configuration = new Configuration();

            Properties settings = new Properties();
            settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
            settings.put(Environment.URL, URL);
            settings.put(Environment.USER, USERNAME);
            settings.put(Environment.PASS, PASSWORD);
            settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");

            settings.put(Environment.SHOW_SQL, "true");
            settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
            settings.put(Environment.HBM2DDL_AUTO, "");

            configuration.setProperties(settings);
            configuration.addAnnotatedClass(User.class);

            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();

            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
            System.out.println(ANSI_GREEN + "Настройка конфигурации успешна" + ANSI_RESET);
        } catch (Exception e) {
            System.out.println(ANSI_RED + "Ошибка конфигурации" + ANSI_RESET);
        }
    }
    return sessionFactory;
}

Запрос создания таблицы:

String create = "CREATE TABLE IF NOT EXISTS users " +
        "(id LONG NOT NULL AUTO_INCREMENT PRIMARY KEY, " +
        "name VARCHAR(50) NOT NULL, lastName VARCHAR(50) NOT NULL, " +
        "age BYTE NOT NULL)";

ПРОБЛЕМА:

Методы удаление пользователя по ID и вывода всей таблицы в список

public void removeUserById(long id) {

    try {
        Session session = getSessionFactory().openSession();
        session.beginTransaction();


        User del = session.get(User.class, id);
        session.delete(del);

        session.getTransaction().commit();
        session.close();
        System.out.println(ANSI_GREEN + "Удаление пользователя успешно!" + ANSI_RESET);
    } catch (Exception e) {
        System.out.println(ANSI_RED + "Пользователь не был удален" + ANSI_RESET);
        System.out.println("Because you have" + ANSI_RED + " EXCEPTION " + ANSI_RESET + e);
    }

}

@Override
public List<User> getAllUsers() {
    String list = "from User";
    List<User> fake = new ArrayList<>();
    try {
        Session session = getSessionFactory().openSession();
        Transaction transaction = session.beginTransaction();

        List<User> ls = session.createQuery("from User")
                        .getResultList();

        for(User l : ls){
            System.out.println(l);
        }

        session.getTransaction().commit();
        session.close();
        System.out.println(ANSI_GREEN + "Вывод данных успешен!" + ANSI_GREEN);
    } catch (Exception e) {
        System.out.println(ANSI_RED + "Вывод данных не выполнен!" + ANSI_RESET);
        System.out.println("Because you have" + ANSI_RED + " EXCEPTION " + ANSI_RESET + e);
    }
    return fake;
}

Данные из терминала:

    июл. 10, 2023 12:21:33 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate ORM core version 5.6.3.Final
июл. 10, 2023 12:21:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
июл. 10, 2023 12:21:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.mysql.cj.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/mydbtest]
июл. 10, 2023 12:21:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {password=****, user=root}
июл. 10, 2023 12:21:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
июл. 10, 2023 12:21:33 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
июл. 10, 2023 12:21:34 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Настройка конфигурации успешна
Таблица успешно создана!
Добавление выполнено!
Добавление выполнено!
Добавление выполнено!
Добавление выполнено!
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.lastName as lastname3_0_0_, user0_.name as name4_0_0_ from User user0_ where user0_.id=?
июл. 10, 2023 12:21:34 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1146, SQLState: 42S02
июл. 10, 2023 12:21:34 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table 'mydbtest.user' doesn't exist
июл. 10, 2023 12:21:34 PM org.hibernate.event.internal.DefaultLoadEventListener doOnLoad
INFO: HHH000327: Error performing load command
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37)
    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.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:390)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:163)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:104)
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:285)
    at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4521)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4511)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:571)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:539)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:327)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118)
    at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1226)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1215)
    at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:201)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2830)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2807)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2763)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2807)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:1023)
    at jm.task.core.jdbc.dao.UserDaoHibernateImpl.removeUserById(UserDaoHibernateImpl.java:101)
    at jm.task.core.jdbc.service.UserServiceImpl.removeUserById(UserServiceImpl.java:25)
    at jm.task.core.jdbc.Main.main(Main.java:22)
Caused by: java.sql.SQLSyntaxErrorException: Table 'mydbtest.user' doesn't exist
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
    ... 24 more

Пользователь не был удален
Because you have EXCEPTION org.hibernate.exception.SQLGrammarException: could not extract ResultSet
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.lastName as lastname3_0_, user0_.name as name4_0_ from User user0_
Вывод данных не выполнен!
Because you have EXCEPTION javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
июл. 10, 2023 12:21:34 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1146, SQLState: 42S02
июл. 10, 2023 12:21:34 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table 'mydbtest.user' doesn't exist
Таблица успешно удалена!

Методы создания таблицы, добавления пользователя и удаление таблица выполняется успешно, ошибка появляется на методе удаления пользователя по id и вывода всей таблица в терминал Что пошло не так? Из-за чего возникает ошибка?

Ответы

▲ 0

вам в логе выведено: "Таблица mydbtest.user не существует". Причина: вы в запросе на создание таблицы обозначили её как "users", а обращаетесь к таблице "user".

Проблемы тут: List ls = session.createQuery("from User")

и тут: User del = session.get(User.class, id); User.class вернет User, а не Users

▲ 0

Решение: При создании таблицы изменил addEntity на executeUpdate и все заработало