我正在使用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
。
谢谢你的回应。我会看看我正在使用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