В 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
» для сопоставления сообщений пользователям, чтобы они могли объединяться между собой?