PSQLException: ОШИБКА: связь не существует

Я использую базу данных Hibernate и PostgreSQL. У меня есть несколько схем (и много таблиц в каждой из них) и общий метод, который принимает класс сущности и возвращает все записи в зависимости от переданной сущности:

public <T> List<T> getAll(Class<T> entityClass)

После нахождения имени таблицы объекта (например, «EMPLOYEE») он выполняет List list = criteria.list();, который создает этот sql SELECT * FROM EMPLOYEE. Но он выдает PSQLException: ERROR: relation doesn't exist, потому что это должен быть SELECT * FROM MYSCHEMA.EMPLOYEE (необходимо добавить схему). Как с этим справиться?

Это не мой метод, так как я использую Spring Data JPA на уровне персистентности, и у него нет проблем с идентификацией схемы, и я плохо разбираюсь в собственном спящем режиме. Я пытаюсь помочь своему коллеге.

А вот метод:

 @Override
@Transactional
public <T> List<T> getAll(Class<T> entityClass, Map<String, Object> filter, String... fetchProfiles) {
    Session session;
    try {
        session = sessionFactory.getCurrentSession();

        if (fetchProfiles != null) {
            for (String fetchProfile : fetchProfiles) {
                session.enableFetchProfile(fetchProfile);
            }
        }
        Criteria criteria = session.createCriteria(entityClass);

        if (filter != null) {
            for (Map.Entry<String, Object> entry : filter.entrySet()) {
                if (entry.getValue() == null) {
                    criteria.add(Restrictions.isNull(entry.getKey()));
                } else {
                    if (entry.getValue() instanceof Collection) {
                        criteria.add(Restrictions.in(entry.getKey(), (Collection) entry.getValue()));
                    } else if (entry.getValue() instanceof BetweenValue) {
                        BetweenValue bv = (BetweenValue) entry.getValue();
                        if (bv.getBoundLeft() != null) {
                            criteria.add(Restrictions.ge(entry.getKey(), bv.getBoundLeft()));
                        }
                        if (bv.getBoundRight() != null) {
                            criteria.add(Restrictions.le(entry.getKey(), bv.getBoundRight()));
                        }
                    } else if (BaseEntity.class.isAssignableFrom(ReflectionUtils.findField(entityClass, entry.getKey()).getType()) && entry.getValue() instanceof Long) {
                        BaseEntity fieldEntity = null;
                        try {
                            fieldEntity = (BaseEntity) ReflectUtils.createFieldInstance(entityClass, entry.getKey());
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        fieldEntity.setId((Long) entry.getValue());
                        criteria.add(Restrictions.eq(entry.getKey(), fieldEntity));
                    } else {
                        criteria.add(Restrictions.eq(entry.getKey(), entry.getValue()));
                    }
                }
            }
        }
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        List list = criteria.list();
        if (fetchProfiles != null) {
            for (String fetchProfile : fetchProfiles) {
                session.disableFetchProfile(fetchProfile);
            }
        }
        return list;
    }

@Billy Frost проверьте, чтобы отредактировать

Mukhamedali Zhadigerov 08.08.2018 16:13

@Billy Frost Есть ли способ указать критериям, какую схему искать?

Mukhamedali Zhadigerov 08.08.2018 16:26

Какую именно ошибку вы получаете (проверьте файл журнала postgres, он должен сообщить вам имя несуществующей связи) и каково настоящее имя таблицы (проверьте psql / pgadmin). Я предполагаю, что это проблема чувствительности к регистру.

404 08.08.2018 17:23

@eurotrash Ошибка: PSQLException: ОШИБКА: связь не существует. Поскольку session.createCriteria(entityClass) не добавляет имя схемы при создании запроса SQL. Итак, SELECT * FROM EMPLOYEE выдает ошибку, указанную выше. Sql-запрос должен быть таким: SELECT * FROM MYSCHEMA.EMPLOYEE

Mukhamedali Zhadigerov 09.08.2018 07:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
68
0

Другие вопросы по теме