我有一个名为User的实体类,其中变量username带有ElementCollectionMap来表示两个用户之间的“友谊”,由userId、开始日期和朋友的idMap。该关系的代码如下:
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "friendship", joinColumns = @JoinColumn(name="userId"))
@MapKeyColumn(name = "friendId")
@Column(name = "startDate")
private Map<Integer, Date> friendShipMap;
字符串
我想在每个用户的个人资料页面上显示朋友。我知道我可以通过Java访问Map并获取id(并找到朋友的用户名),但我想使用自定义@Query来获取给定id的所有朋友的用户名。不知何故,Map让我感到困惑,我找不到合适的语句。
任何帮助在这方面是非常赞赏。
编辑:为了澄清,我想为以下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
型
2条答案
按热度按时间jgzswidk1#
您可以使用此
@Query
字符串
确保你的实体
Users
和Friendship
之间有一个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的
gopyfrb32#
你需要用transaction试试看。
字符串