【问题标题】:How to call Named Query如何调用命名查询
【发布时间】:2010-04-30 09:52:28
【问题描述】:

我在实体类 Voter 中写了一个命名查询

NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password),

我想调用这个命名查询,我还需要设置 voterID 和密码。

你能帮帮我吗?谢谢

【问题讨论】:

    标签: jpa named-query


    【解决方案1】:

    我假设您错过了 NamedQuery 注释上的 @ 符号?

    在代码中,你可以这样称呼它:

    List results = em.createNamedQuery("Voter.findvoter")
        .setParameter("voterID", "blah")
        .setParameter("password","blahblahblah")
        .getResultList();
    

    【讨论】:

    • 如何找到列表的元素类型以便对其进行迭代?
    • 改用 TypedQuery。 em.createNamedQuery("Voter.findvoter",Voter.class);
    【解决方案2】:

    您的命名查询有两个明显的问题会导致问题:

    • 这是一个注解,所以它应该是@NamedQuery 而不仅仅是NamedQuery
    • 您的查询目前是:

    query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password.

    问题是你在:voterID 之后终止了你的字符串,而不是在:password 之后你有两次“where”,并且在“:”和“password”之间有一个空格。您的查询应如下所示:

    query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID and v.password= :password"

    (我刚刚将 " 移到末尾,并删除了第二个 "where" 和 ":" 后面的空格)

    【讨论】:

      【解决方案3】:

      常见的步骤是(命名查询或其他)

      1. 创建查询 - em 有五个创建方法。
      2. 根据需要使用参数设置查询 - 查询接口具有这些方法。
      3. 执行查询——查询接口有3个执行相关的方法。

      通过以上三个步骤,您可以运行任何 JPA 查询。

      【讨论】:

        【解决方案4】:

        其实 brent 是对的,你的 NameQuery 应该是这样的,

        @NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID AND where v.password = :password")
        @Entity
        public class Voter implements Serializable{ ... }
        

        你应该在其他地方试试这个(迪克已经说过)

        public class VoterFasade{
            public List<Voter> findVoter(long id,String password){
                List<Voter> results = em.createNamedQuery("Voter.findvoter")
                    .setParameter("voterID", id)
                    .setParameter("password",password)
                    .getResultList();
                return result;
            }
        }
        

        那么你可以像这样使用它

        @Inject
        VoterFasade voterFasade;
        
        ///
        long id=12;
        voterFasade.findVoter(id);
        

        应该确实可以工作。(它是一个未编译的代码)。

        你也可以用 Repository 来做,检查下面的链接,部分 Repository Listing23.Example repository enter link description here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-02
          • 2010-10-05
          • 1970-01-01
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          • 2017-10-26
          相关资源
          最近更新 更多