将复杂查询存储为命名查询

Posted

技术标签:

【中文标题】将复杂查询存储为命名查询【英文标题】:Storing Complex Query as Named Query 【发布时间】:2013-04-15 04:56:12 【问题描述】:

我正在使用 JSF 2 做一个项目,并且我有一个特别复杂的查询来提供电影建议。我试图把它作为一个命名查询,编译器告诉我有一个错误,老实说我不知道​​在哪里看

SELECT M.*
FROM Account A,
     Movie M,
     Orders O,
     Rental R,
  (SELECT Acc.Id
   FROM Account Acc,
     (SELECT COUNT(*) AS c,
             Acc.Id
      FROM Account Acc,
        (SELECT M.*
         FROM Account A,
              Rental R,
              Orders O,
              Movie M
         WHERE A.Id=R.AccountId
           AND R.MovieId=M.Id
           AND R.OrderId=O.Id
           AND A.Id=:id) AS a
      INNER JOIN
        (SELECT M.*,
                A.Id AS AccountId
         FROM Account A,
              Rental R,
              Orders O,
              Movie M
         WHERE A.Id=R.AccountId
           AND R.MovieId=M.Id
           AND R.OrderId=O.Id
           AND A.Id<>:id) AS b USING (Id,Name,TYPE,Rating,DistrFee,NumCopies)
      WHERE Acc.Id = b.AccountId ) AS COUNT
   WHERE COUNT.c>0
     AND COUNT.Id = Acc.Id) AS SimilarAccount
WHERE A.Id=R.AccountId
  AND R.MovieId=M.Id
  AND R.OrderId=O.Id
  AND A.Id=:id
  AND M.Id NOT IN
    (SELECT M.Id
     FROM Account A,
          Rental R,
          Orders O,
          Movie M
     WHERE A.Id=R.AccountId
       AND R.MovieId=M.Id
       AND R.OrderId=O.Id
       AND A.Id=SimilarAccount.Id)

抛开性能问题(教授希望通过 mysql 完成电影建议),我不确定存储此查询以供重复使用的过程。我会将查询存储为视图,但它有一个参数(它需要用户的参数 id)

您建议如何存储此查询?

【问题讨论】:

也许是View?不...有参数。存储过程,否则。 "AND A.Id=:id" :id 是一个参数。这些是 JPA 中 NamedQueries 的正常语法。我通过将其转换为存储过程并通过 NativeQuery 调用该过程来使其工作。不过,如果有人有更好的主意,我会留下这个问题。 【参考方案1】:

我建议创建一个带有键值对的 Java 属性文件,并在您的 DAO 类中创建一个属性类型的私有字段,并使用 Spring 配置将其注入,该配置将从文件中读取值,或者您可以考虑使用存储过程。 . 如果我理解你的权利....

【讨论】:

我不使用 Spring,直接使用 JSF2。不过谢谢你的建议。

以上是关于将复杂查询存储为命名查询的主要内容,如果未能解决你的问题,请参考以下文章

我应该将此方法的查询转换为存储过程吗? [关闭]

SQL基础教程(第2版)第5章 复杂查询:5-2 子查询

三 JPA复杂查询的几种方式

第五章 复杂查询 5-2 子查询

如何将复杂的 django 查询构建为字符串

MySQL常用SQL(含复杂SQL查询)