2015-10-13 71 views
0

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

@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的所有朋友用户名。不知何故,地图令我感到困惑,我无法为此找到合适的声明。

对此非常感谢。

编辑:为了澄清,我想用一个自定义@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从用户加入友谊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") 

确保你有你的实体UsersFriendship之间的association。应该是@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

+0

我从http://stackoverflow.com/questions/20663704/hibernate-user-and-friend-relationship-add-other-column获得了代码,包含地图(id,日期)以表示此开始日期关系。问题是,我没有得到任何查询结果,或者(使用你的查询)它是org.hibernate。QueryException:无法解引用标量集合元素:friendId – Lukehey

+0

刚刚编辑我的原始帖子,显示一个不起作用的示例查询。地图本身不包含userId,而是包含friendId,因此我不能像这样引用它。我不知道如何继续从这个代码 – Lukehey

+0

只有两个类真的值得一提。用户实体类有一个id(userId),用户名和@ElementCollection friendShipMap 。另一个是我的界面扩展JpaRepository ,提供我的自定义查询。两者都在我的原始文章中提供。本身没有实体类代表友谊,因为这就是我使用收集表的原因。 – Lukehey