如何通过键来定义与另一个表实际上没有关联的列,而是通过关键字

时间:2009-12-27 11:55:57

标签: hibernate database-design scala jpa

我正在使用JPA来查看它会有多大帮助,而不是使用直接的SQL,我今天意识到我的一个列不正确。

我有一个播放列表应用程序。每个播放列表都有一个标题和一个表示要包含的歌曲的关键字列表。

所以,我可能将其作为一行,其中有三个关键字。 练习steady-beat_country hard_rock classic_rock

如果我添加了一首应用了其中一个关键字的新歌曲,我希望在选择此播放列表时将其拉出。

我可以浏览所有具有此关键字的播放列表并将新歌与播放列表相关联,但如果我有多个用户,每个播放列表都有很多播放列表,那么这似乎效率非常低,如果所有播放列都可以播放的话用户。

我很好奇我是否应该在我的@Entity模型中执行此操作,该模型使用Scala编写:

@transient
var songs : java.util.List[Song] = new java.util.ArrayList[Song]()

@OneToMany{val cascade=Array(CascadeType.ALL), val mappedBy="playlist"}
var keywords : java.util.List[Snippet] = new java.util.ArrayList[Snippet]()

然后我可以加载实际与播放列表相关的关键字,然后调用可以通过关键字列表加载歌曲的命名查询。

或者,有没有办法在JPA中定义这样的东西,所以我不需要多打一个电话?

更新

今晚我测试了这个,但我想知道我是否可以设置我的命名查询来执行此查询,所以它会是这样的:

SELECT Playlist p, Songs s WHERE p.user = :user AND s.keywords IN (p.keywords)

这段代码有点瑕疵因为IN我需要查看如何在JPA中执行此操作,我可能需要将关键字存储为逗号分隔,但我不确定如何才能让歌曲填充在song的{​​{1}}属性中。

1 个答案:

答案 0 :(得分:1)

您的歌曲和关键字之间存在多对多的关系 我相信您的查询应该是select p from Playlist p, Songs s where p.user = :user and s.keywords member of p.keywords,尽管我不是100%确定您可以在两个集合之间执行member of操作。您可能必须使用子查询来获取所有p.keywordsANY表达式才能执行此操作。有关详情,请参阅this article

在您的回答之后,我意识到播放列表不是您从JPQL获得的歌曲列表。您正试图在播放列表对象中设置字段。

如果您认为JPA只是一种简单的数据库工作方式。你是对的。你不能真正做我认为你用任何OO语言做的事情。您无法将字段定义为查询的结果。

但是,您可以从作为播放列表一部分的用户,名称和关键字中获取播放列表定义。然后运行查询以查找包含这些关键字的歌曲,然后在java中执行curPlaylist.addAll( queryResult); em.merge(curPlaylist);之类的操作。这假设你当然设置了你的级联。现在,当您从实体管理器获取播放列表时,您还将撤回播放列表。

如果您要查找更动态的内容,列表会自动更新,则每次需要符合播放列表条件的列表时都可以运行查询。