Hibernate CriteriaBuilder: как написать критерий соединения в случае, если поле, используемое для соединения, имеет тип String (идентификатор объекта для присоединения) - PullRequest
0 голосов
/ 19 июня 2020

В Hibernate у меня есть Entity с именем Message, у которого есть внешний ключ к User (автору сообщения). Сложность в том, что тип этого поля String - имя этого пользователя (а не на самом деле User). По некоторым техническим причинам мне нужно, чтобы это был String.

@Entity
public class Message {

    @ManyToOne(targetEntity = User.class)
    @JoinColumn(name = "AUTHOR", referencedColumnName = "LOGIN_NAME")
    private String authorName;

}

Теперь я пишу запрос для этих сообщений, используя CriteriaBuilder. И вопрос: как мне записать join в сущность User? Простая передача атрибута Message_.AUTHOR вызывает исключение, говорящее: «Невозможно присоединиться к атрибуту базового типа c».

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Message> criteriaQuery = criteriaBuilder.createQuery(Message.class);
        Root<Message> root = criteriaQuery.from(Message.class);
        Join<Message, User> joinToUsers = root.join(Message_.AUTHOR); // does not work!!
        joinToUsers.on(criteriaBuilder.equal(root.get(Message_.AUTHOR_NAME), joinToUsers.get(User_.LOGIN_NAME)));

Есть ли способ написать такое соединение? Или мне понадобится вспомогательная таблица «MESSAGE_USER» для сопоставления сообщений пользователям, чтобы они могли объединяться между собой?

...