Я использую базу данных 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 Есть ли способ указать критериям, какую схему искать?
Какую именно ошибку вы получаете (проверьте файл журнала postgres, он должен сообщить вам имя несуществующей связи) и каково настоящее имя таблицы (проверьте psql / pgadmin). Я предполагаю, что это проблема чувствительности к регистру.
@eurotrash Ошибка: PSQLException: ОШИБКА: связь не существует. Поскольку session.createCriteria(entityClass) не добавляет имя схемы при создании запроса SQL. Итак, SELECT * FROM EMPLOYEE выдает ошибку, указанную выше. Sql-запрос должен быть таким: SELECT * FROM MYSCHEMA.EMPLOYEE




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