Hibernnate QuerySyntaxException:未映射用户

时间:2016-04-21 18:09:16

标签: java hibernate

我有一个有效的网络项目。然后,我被委托将所有的hibernate代码移出war项目并进入它自己的jar。我将persistence.xml移动到新jar的META-INF。

登录时我现在收到此错误:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [from User where lower(name) = :userName]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1679)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)

我可以在日志中看到正在正确加载persistence.xml并连接到数据库,所以我知道正在读取带有hibernate代码的新jar。 c3p0和mysql jar位于WEB-INF / lib目录中。我可以从mysql-workbench连接到数据库。

这个相同的代码在旧的war文件中有效,所以我知道这不是一个技术问题,比如有错误的情况,或映射到错误的表。就在我把代码拉到另一个项目的时候,我将它作为maven依赖项, - 某些东西没有被正确读取。

任何想法?

更新

尝试了一些事情。我将persistence.xml带入war文件的WEB-INF,META-INF,这些类无效。 (我不认为这是问题,因为它正在拿起数据库网址名称/密码。)

我发现了一个使用该类的完整包名称的建议,以及一些令人讨厌的事情。这是代码:

List<User> users = getEntityManager().createQuery("from com.xxx.xxx.persistence.model.User where lower(name) = :userName")
  .setParameter("userName", name.toLowerCase())
  .getResultList();

现在我得到了这个例外:

WARN  04-21 18:18:16 HHH000183: no persistent classes found for query class: from com.xxx.xxx.persistence.model.User where lower(name) = :userName  (QuerySplitter.java:124)
java.lang.IllegalArgumentException: Parameter with that name [userName] did not exist

没有持久化类只是一个警告,并且execption显然是错误的,因为你可以看到我设置了该参数,是的我有一个非空值。

任何方向都会有所帮助, 谢谢

PERSISTENCE

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="sessionfactory">     
    <provider>org.hibernate.ejb.HibernatePersistence</provider>     
    <class>com.xxx.xxx.persistence.model.Role</class> 
    <class>com.xxx.xxx.persistence.model.User</class> 
    <properties>  
      .....          
    </properties>
</persistence-unit>
</persistence>   

修改

所以这很奇怪,当我硬编码这样的名字时:

getEntityManager().createQuery("from com.xxx.xxx.persistence.model.User where lower(name) = 'me'")
.setParameter("userName", name.toLowerCase())
.getResultList();

我仍然得到&#34;带有该名称的参数不存在&#34;如果我完全删除它:

getEntityManager().createQuery("from com.xxx.xxx.persistence.model.User where lower(name) = 'me'")
.getResultList();

我工作(我认为,但日志中的错误来自下一个数据库查询)

那个entityManager(它是一个javax.persistence.EntityManager)必定是错的。

1 个答案:

答案 0 :(得分:0)

您能否请尝试以下查询

List<User> users =      getEntityManager().createQuery("from com.xxx.xxx.persistence.model.User where name    = :name")
  .setParameter("name", name.toLowerCase())
 .getResultList();