【问题标题】:JPA Query does not workJPA 查询不起作用
【发布时间】:2014-01-19 08:02:19
【问题描述】:

你能帮我解决这个问题吗?我想使用这种方法在我的数据库中查找特定的昵称(它是用 Apache Derby 制作的)。我在 NetBeans 中使用了 EntityManager 和映射 Persistence - 来自数据库的实体类。

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] 查询包含格式错误的结尾。

请问哪里有问题?

【问题讨论】:

  • 即使您使用:“FROM User u WHERE u.nick =:nick”作为查询?
  • 问题出在哪里?这不是有效的 JPQL 查询。 JPQL 中没有“*”。任何基本的 JPA 参考都会告诉您这一点

标签: java jpa


【解决方案1】:

应该是

更新

根据您的评论,现在查询应该是:

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 的字段(属性)。

你的 User 类应该看起来很像这样

@Entity
public class User {

      @Id
      private long userId;

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

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

      // setter getter
}

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

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

From User u

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

 Select alias.property
 from Entity alias

或者在你的特殊情况下

 Select u.nick
 From User u

在这种情况下,创建用户类型的实例并设置字段昵称。

【讨论】:

  • 谢谢,但现在我收到此错误:javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions .DatabaseException 内部异常:java.sql.SQLSyntaxErrorException:语法错误:在第 1 行第 9 列遇到“FROM”。错误代码:-1 调用:SELECT FROM User WHERE (Nick = ?) bind => [1 parameter bound] 查询: ReportQuery(referenceClass=User sql="SELECT FROM User WHERE (Nick = ?)")
  • 如果我使用“u”,我会收到此错误:java.lang.IllegalArgumentException:在 EntityManager 中创建查询时发生异常:异常描述:编译问题 [SELECT User u From User u Where u .nick = :nick]。 [24, 25] 不能多次声明标识变量“u”。 [12, 13] 标识变量 'u' 不能多次声明。
  • 简单尝试:from User u where u.nick = :nick,不带 select 语句。
  • 把 u 放在括号中,或者像 Laabidi Raaisi 建议的那样,只使用不带 select 语句的 from 子句
  • 请尝试您在问题中提到的确切代码,只是没有“select *”,如果有的话,请给我们结果错误。你在这里使用“?”在您的查询中,我们不知道您是如何设置参数值的
【解决方案2】:

如果 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();

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

【讨论】:

  • 谢谢,如果我使用您的第二个输出,我会收到此错误:javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org. eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLSyntaxErrorException:语法错误:在第 1 行第 15 列遇到“用户”。错误代码:-1 调用:SELECT 1 FROM User WHERE (Nick = 'aaa') 查询: ReportQuery(referenceClass=User sql="SELECT ? FROM User WHERE (Nick = ?)")
  • 我怀疑你的底层数据库有 User 作为保留字。尝试更改表名(在实体类上使用@Table 注解)。
  • 谢谢,用户确实是保留字。我创建了名为 Userr 的新项目。我使用了这个查询:“SELECT UserID, EnterKey, Nick FROM Userr WHERE (Nick = :nick)”,我得到这个错误:java.lang.IllegalArgumentException:在EntityManager中创建查询时发生异常:异常描述:语法错误解析 [SELECT UserID, EnterKey, Nick FROM Userr WHERE (Nick = :nick)]。 [41, 41] 必须为范围变量声明提供标识变量。你能帮帮我吗?
  • 这不是 JPA 查询。改为使用:SELECT u.UserID, u.EnterKey, u.Nick FROM Userr u WHERE u.Nick = :nick
猜你喜欢
  • 2017-02-25
  • 1970-01-01
  • 2021-11-19
  • 2015-09-29
  • 2018-03-20
  • 2019-07-16
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多