如何调用命名查询(Named Query)

20

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

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

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

你能帮助我吗?谢谢。

4个回答

38

我猜你在NamedQuery注解上忘记了@符号了吧?

在代码中,你应该这样调用它:

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

如何找到列表的元素类型以便迭代它? - zionpi
2
使用 TypedQuery 替代。em.createNamedQuery("Voter.findvoter", Voter.class); - Dick Chesterwood

4
您的命名查询存在两个明显问题,这会导致问题:
  • 它是一个注释,因此应该是@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”和“:”后的空格)


2

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

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

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


1
实际上,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{ ... }

还有其他地方你应该尝试这个(Dick已经说过了)

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 在此输入链接说明


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接