2016-04-21 77 views
0

我有一个正常工作的Web项目。然后我负责将所有的Hibernate代码从战争项目中移出并放入它自己的jar中。我将persistence.xml移到了新jar的META-INF中。Hibernnate QuerySyntaxException:用户未映射

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

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中被正确加载,并连接到数据库的日志中看到,所以我知道新的罐子正在读取休眠代码。 c3p0和mysql jar位于WEB-INF/lib目录中。我可以从mysql-workbench连接到数据库。

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

任何想法?

UPDATE

试了几件事情。我将persistence.xml引入war文件的WEB-INF,META-INF,这些id不起作用的类。 (我不认为这是问题无论如何,因为它是拿起数据库的网址名称/密码。)

我发现了一个建议,使用完整的包名称的类,并发生了一些werid发生。这是代码:

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

我仍然得到“参数与名称不exisit”如果我完全删除:

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

我的工作(我想,但在日志中的错误是从下一个DB查询)

因此,这个entityManager必须有错(它是一个javax.persistence。EntityManager的)

+0

能否请您尝试添加下面的持久性文件,< class >路径到你的用户类 – LearningPhase

+0

我在那里,但没有运气 – mmaceachran

+0

可以吗尝试将您的查询从com.xxx.xxx.pers ..更改为仅限用户 – LearningPhase

回答

0

可否请您尝试以下查询

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

WARN 04-21 23:59:56 HHH000183:没有为查询类找到持久类:从com.xxx。 xxx.persistence.model.User其中name =:name(QuerySplitter.java:124) java.lang.IllegalArgumentException:具有该名称[name]的参数不存在 – mmaceachran

+0

数据库中列的大小写是什么Name或名称或NAME? – LearningPhase