«Идентификатор из нескольких частей ... не может быть связан».ошибка при использовании гибернации - PullRequest
0 голосов
/ 25 сентября 2019

Я работаю над довольно сложным проектом, который получает имя таблицы и список столбцов (и, возможно, объединения и другие забавные вещи): «Идентификатор из нескольких частей ... не может быть связан».Я работаю на 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 году).Могу ли я просто указать имя таблицы в качестве псевдонима для себя?Или я должен просто присоединиться к столу к чему-то?

(Кроме того, любые советы передового опыта будут оценены)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...