我有一个有效的网络项目。然后,我被委托将所有的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)必定是错的。
答案 0 :(得分:0)
您能否请尝试以下查询
List<User> users = getEntityManager().createQuery("from com.xxx.xxx.persistence.model.User where name = :name")
.setParameter("name", name.toLowerCase())
.getResultList();