JPA查询ElementCollection键

时间:2015-10-13 11:12:08

标签: java jpa

我有一个名为User的实体类,其变量username带有ElementCollection地图,用于表示两个用户之间的“友谊”,由userId映射,开始日期和朋友的id。该关系的代码如下:

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

我想在每个用户的个人资料页面上显示朋友。我知道我可以通过Java访问地图并获取ID(并找到像这样的朋友的用户名),但我想使用自定义@Query来获取给定id的所有朋友用户名。不知何故,地图让我感到困惑,我没有找到适当的声明。

非常感谢任何帮助。

编辑:为了澄清,我想为以下SQL语句使用自定义@Query语句:

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

1 个答案:

答案 0 :(得分:1)

您可以使用此@Query

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

确保您的实体associationUsers之间有Friendship。我认为应该是@OneToMany关系。

它应该在List<String>而不是Map

修改: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