你能帮我解决这个问题吗?我想用这个方法在我的数据库中查找特定的缺口(用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]查询包含格式错误的结尾。
请问哪里有问题?
答案 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();
通过返回一个简单的布尔值,可以最小化数据库响应。