JPA查询不起作用

时间:2014-01-01 21:16:39

标签: java jpa

你能帮我解决这个问题吗?我想用这个方法在我的数据库中查找特定的缺口(用Apache Derby制作)。我在NetBeans中使用了EntityManager并映射了Persistence中的Persistence - Entity类。

public static boolean findByNick(String nick) {

    List<eng.db.User> ret;
    EntityManager em = getEntityManager();

    Query q = em.createQuery("SELECT * FROM User u WHERE u.nick =:nick");
    q.setParameter("nick", nick);
    ret = q.getResultList();
    em.close();

    boolean hodnota = false;

    if (ret.isEmpty()) {
        hodnota = true;
    }

    return hodnota;
}

我收到此错误:

  

java.lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:
      异常说明:语法错误解析[SELECT * FROM User u WHERE u.nick =:nick)]       [21,21] select语句必须有FROM子句       [7,7]算术表达式中缺少左表达式       [9,20]正确的表达式不是算术表达式       [41,42]查询包含格式错误的结尾。

请问哪里有问题?

2 个答案:

答案 0 :(得分:0)

它应该是

更新

根据你的comnent现在查询应该是:

SELECT u.userID, u.enterKey, u.nick 
FROM User u
WHERE u.nick = ?

或使用命名参数

SELECT u.userId, u.enterKey, u.nick 
FROM User u
WHERE u.nick = :nick

其中usereID,enterKey和nick是实体类型User的字段(属性)。

您的用户类看起来应该与此类似

@Entity
public class User {

      @Id
      private long userId;

     @column(name="EnterKey"
      private String enterKey;

      @column(name="nick")
      private String nick;

      // setter gettee
}

注意这个hql并使用您定义为查询参数的对象模型的类和属性名称。

在您的查询中

Hibernate或任何其他JPA实现使用您定义的映射创建User类型的对象列表。 expressen *不能与此类型的对象名相关联。在sql中等价于*的是与对象相关的查询语言,只是from子句的别名“u”sine from子句看起来像这样:

From User u

如果您只想选择实体的单独字段,则必须声明

 Select alias.property
 from Entity alias

或在您的特殊情况下

 Select u.nick
 From User u

在这种情况下,将创建User类型的实例并设置字段缺口。

答案 1 :(得分:0)

如果nick是您实体的主键(@Id),请使用:

return em.find(eng.db.User, nick) != null;

如果不是:

Query q = em.createQuery("SELECT TRUE FROM User u WHERE u.nick =:nick");
q.setParameter("nick", nick);
return !q.getResultList().isEmpty();

通过返回一个简单的布尔值,可以最小化数据库响应。