2009-12-27 52 views
1

我正在使用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中定义像这样的东西,所以我不必拨打额外的电话?

UPDATE:

今晚我测试这一点,但我想知道如果我可以建立我的命名查询要做到这一点查询,所以这将是这样的:

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

这段代码有点有缺陷,因为IN需要查看我如何在JPA中执行此操作,但可能需要将关键字存储为逗号分隔符,但我不确定如何将歌曲填入song物业为playlist

回答

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);的操作。这假设你有你的瀑布当然设置正确。现在,当您从实体管理器中获取播放列表时,您还将撤回播放列表。

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

+0

谢谢你的回应。我会看看我正在使用IN的成员,如下所示:http://download.oracle.com/docs/cd/E11035_01/kodo41/full/html/ejb3_langref.html#ejb3_langref_collection_dec,虽然这篇文章有错误,但是我的方法意味着我正在逐个检查每个关键字。 – 2009-12-29 19:29:33