Я работаю над довольно сложным проектом, который получает имя таблицы и список столбцов (и, возможно, объединения и другие забавные вещи): «Идентификатор из нескольких частей ... не может быть связан».Я работаю на Java 1.7 с Spring 4.3.18.RELEASE и Hibernate 5.10, подключающихся к базе данных MS SQLServer (я думаю, что версия 12).Я написал простой метод, который дублирует проблему:
@Transactional(propagation = Propagation.MANDATORY)
public List<Object[]> testQuery() {
Class<?> rootClass = getEntityClassByTable("pm_project");
Session session = entityManager.unwrap(Session.class);
Criteria crit = session.createCriteria(rootClass);
List<String> columnList = new ArrayList<>();
columnList.add("pm_project.pm_project_id");
columnList.add("pm_project.pm_project_name");
columnList.add("pm_project.pm_project_title");
columnList.add("pm_project.parent_id");
columnList.add("pm_project.pm_project_from_date");
ProjectionList projList = Projections.projectionList();
for (String column : columnList) {
String[] columnAliases = new String[0];
Type[] types = new Type[1];
types[0] = StringType.INSTANCE;
projList.add(Projections.sqlProjection(column, columnAliases, types));
}
crit.setProjection(projList);
List<Object[]> results = crit.list();
return results;
}
'getEntityClassByTable' получает класс сущности для таблицы с указанным именем.
Внутри Hibernate генерируется этот sql:
select pm_project.pm_project_id, pm_project.pm_project_name, pm_project.pm_project_title, pm_project.parent_id, pm_project.pm_project_from_date from pm_project this_
Это также выходит за пределы спящего режима из-за 'this_' в конце.Поскольку имена столбцов указывают таблицу, из которой они поступают (даже если существует только одна таблица), система запутывается, поскольку она предоставила свой собственный псевдоним для таблицы, и я получаю эту ошибку.Мне нужно решение, которое может принять вид строк, представленных здесь, поскольку они взяты из более старой системы, к которой я не могу прикоснуться (по сути, компания создала собственную проприетарную систему персистентности еще в 2001 году).Могу ли я просто указать имя таблицы в качестве псевдонима для себя?Или я должен просто присоединиться к столу к чему-то?
(Кроме того, любые советы передового опыта будут оценены)