代码之家  ›  专栏  ›  技术社区  ›  James Black

如何按关键字定义实际上与另一个表无关的列

  •  1
  • James Black  · 技术社区  · 16 年前

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

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

    所以,我可以把它作为一行,其中有三个关键字。 练习稳定节奏的乡村硬摇滚经典摇滚

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

    我可以浏览所有有这个关键字的播放列表,将新歌曲与播放列表关联起来,但是如果我有几个用户,每个用户都有许多播放列表,如果所有用户都可以播放这首歌,那么这看起来效率很低。

    我很好奇我是否应该在 @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)

    这段代码有点瑕疵,因为我需要查找如何在JPA中完成它,我可能需要以逗号分隔的方式存储关键字,但我还不确定如何让歌曲填充 song 属性为 playlist .

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jim Barrows    16 年前

    你的歌曲和关键词之间有多对多的关系。
    我相信你的问题应该是 select p from Playlist p, Songs s where p.user = :user and s.keywords member of p.keywords 虽然我不是100%确定你能做一个 member of 两个集合之间的操作。您可能需要使用子查询来获取 p.keywords 以及 ANY 这样做的表达式。见 this article 更多。

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

    如果你认为JPA只是一个简单的方法来做数据库工作。你说得对。你不能真的用任何OO语言做我相信你做的事。不能将字段定义为查询结果。

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

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

    推荐文章