2013-04-15 30 views
2

我正在使用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)

你会如何建议保存此查询?

+2

也许为'View'?不......有参数。存储过程,否则。 – BlitZ

+0

“AND A.Id =:id为”<==这看起来奇怪,也许 “:” 实在太多? – DrCopyPaste

+0

:id是一个参数。这些是JPA中NamedQueries的正常语法。我通过将其转换为存储过程并通过NativeQuery调用过程来实现它。尽管如此,如果有人有更好的主意,我仍然可以解决问题。 –

回答

0

我建议创建一个Java属性与键 - 值对文件,并在你的DAO类类型性质的私人领域,并使用Spring配置它从文件中读取值或U可以考虑使用存储过程把它注射..如果我理解正确的ü....

+0

我不使用Spring,只是直接JSF2。但谢谢你的建议。 –