20

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

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

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

你能帮助我吗。谢谢

4

4 回答 4

38

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

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

List results = em.createNamedQuery("Voter.findvoter")
    .setParameter("voterID", "blah")
    .setParameter("password","blahblahblah")
    .getResultList();
于 2010-04-30T12:17:24.343 回答
4

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

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

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

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

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

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

于 2012-06-22T14:31:24.410 回答
2

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

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

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

于 2010-05-05T21:13:01.747 回答
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

于 2017-04-21T12:45:50.140 回答