如何调用命名查询

时间:2010-04-30 09:52:29

标签: jpa named-query

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

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

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

你能帮我吗?谢谢

4 个答案:

答案 0 :(得分:38)

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

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

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

答案 1 :(得分:4)

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

  • 这是一个注释,因此@NamedQuery不仅仅是NamedQuery
  • 您的查询目前是:

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

问题是你在:voterID之后而不是在:password之后终止了你的字符串,并且你有"其中"两次,你在"之间有一个空格:"和#34;密码"。您的查询应如下所示:

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

(我刚刚将"移到了最后并移除了第二个"其中"以及"之后的空格:")

答案 2 :(得分:2)

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

  1. 创建查询 - em有五种创建方法。
  2. 如果需要,使用参数设置查询 - 查询界面具有这些方法。
  3. 执行查询 - 查询界面有3个与执行相关的方法。
  4. 通过以上三个步骤,您可以运行任何JPA查询。

答案 3 :(得分:1)

实际上布伦特是对的,你的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