2015-10-13 2 views
0

У меня есть класс сущностей под названием User с переменным именем пользователя с картой ElementCollection, чтобы представлять «дружбу» между двумя пользователями, отображаемую идентификатором пользователя, датой начала и идентификатором друга. Код для этого отношения выглядит следующим образом:JPA Query ElementCollection key

@ElementCollection(fetch = FetchType.EAGER) 
@CollectionTable(name = "friendship", joinColumns = @JoinColumn(name="userId")) 
@MapKeyColumn(name = "friendId") 
@Column(name = "startDate") 
private Map<Integer, Date> friendShipMap; 

Я хочу отображать друзей на странице профиля для каждого пользователя. Я знаю, что могу просто получить доступ к карте через Java и получить идентификаторы (и найти имена пользователей для таких друзей), но я бы хотел использовать пользовательский @Query, чтобы получить все имена пользователей пользователей для данного идентификатора. Каким-то образом карта меня сбивает с толку, и я не могу найти правильное заявление для этого.

Любая помощь на это очень ценится.

Edit: Для того, чтобы уточнить, я хотел бы использовать пользовательские @Query заявление на следующий SQL заявление:

select u.username from users u join friendship m on u.userId = m.friendId where m.userId = 1; 

Так я думал, что это будет в основном так:

@Query("SELECT u.username FROM users u join u.friendShipMap m on u.userId = key(m) where m.userId = :userId") 
List<User> getFriends(@Param("userId") int userId); 

Но Я не могу использовать m.userId, он говорит: «Невозможно разделить скалярный элемент коллекции: userId».

Соответствующая таблица выглядит следующим образом:

userId | startDate |friendId 
+0

Можете ли вы показать код, с которым заявления вы пробовали? – Patrick

+0

Удалили их в основном, но в чем я в принципе нуждаюсь, это эквивалент «выберите u.username от пользователей u, присоединитесь к дружбе m на u.userId = m.friendId, где m.userId = 1;" – Lukehey

ответ

1

Вы можете использовать этот @Query

@Query("select u.username from Users u inner join u.friendship f where f.friendId = :userId") 

Убедитесь, что у вас есть association между вашими лицами Users и Friendship. Должно быть отношение @OneToMany, я думаю.

И должно быть в List<String> вместо Map.

EDIT: 1

Если я правильно понимаю, вы будете нуждаться в другом классе friendship.

Возможно, вам нужен вложенный класс (friendship), описанный здесь.

http://www.thejavageek.com/2014/01/31/jpa-elementcollection-annotation/

Или вы можете создать новый объект.

http://www.concretepage.com/hibernate/elementcollection_hibernate_annotation

И это также хороший пример:

https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

+0

У меня есть код для этого из http://stackoverflow.com/questions/20663704/hibernate-user-and-friend-relationship-add-other-column с картой (id, date), чтобы представить дату начала этого отношения. Проблема в том, что я либо не получаю никаких результатов от запроса, либо (используя ваш запрос), это org.hibernate.QueryException: не удается разделить скалярный элемент коллекции: friendId – Lukehey

+0

Отредактировано мое исходное сообщение только сейчас, показывая примерный запрос, который не работает. Сама карта не содержит userId, а скорее friendId, поэтому я не могу ссылаться на нее так. Я не уверен, как продолжить с этого кода – Lukehey

+0

Есть только два класса, о которых стоит упомянуть. Класс User Entity имеет идентификатор (userId), имя пользователя и @ElementCollection friendShipMap . Другой - мой интерфейс, расширяющий JpaRepository , который предоставляет мои пользовательские запросы. Оба они предоставлены в моем оригинальном посте. Не существует класса сущности, представляющего собой дружбу, потому что для этого я использую таблицу коллекций. – Lukehey

Смежные вопросы