请求协助解决HQL语法异常:Utilisateurt未映射问题
解决HQL QuerySyntaxException: 实体未映射的HTTP 500错误
先看你的异常核心信息:
org.hibernate.hql.ast.QuerySyntaxException: Utilisateurt is not mapped [select t from Utilisateurt]
你肯定纳闷,明明实体是Utilisateur,怎么变成Utilisateurt了?这是因为你在GenericDaoImpl里拼接HQL字符串的时候,实体名和别名之间漏掉了空格,把两个字符串粘成了一个,Hibernate自然找不到对应的映射实体了。
我帮你把所有有问题的地方都找出来,逐个修正:
1. selectAll() 方法
原代码里实体名和别名t直接粘在一起:
Query query=em.createQuery("select t from " + type.getSimpleName() + "t");
修正后(补全实体名和别名之间的空格):
Query query=em.createQuery("select t from " + type.getSimpleName() + " t");
2. selectAll(String sortField, String field) 方法
这里不仅实体名和别名缺空格,order by后面的字段也没加空格,会导致排序语法错误:
Query query=em.createQuery("select t from " + type.getSimpleName() + "t order by" + sortField + "" + field);
修正后(补全两处空格):
Query query=em.createQuery("select t from " + type.getSimpleName() + " t order by " + sortField + " " + field);
3. findOne(String paramName, Object paramValue) 方法
同样是实体名和别名缺空格,顺便给参数绑定符号:x加个空格提升可读性:
Query query=em.createQuery("select t from " + type.getSimpleName() + " t where " + paramName + " = :x ");
4. findOne(String[] paramName, Object[] paramValue) 方法
这里from后面、实体名和别名e之间都缺空格,而且拼接字符串时有格式问题:
String requete="select e from " + type.getSimpleName() + " e where ";
同时把循环里的拼接格式调整得更规范:
requete+= "e." + paramName[i] + " = :x" + i;
5. findCountBy(String paramName, String paramValue) 方法
这里有两个问题:一是实体名和别名缺空格,二是参数绑定符号写反了(:=应该是=:),另外统计数量应该用count(t)而不是select t,否则会出现类型转换错误:
Query query=em.createQuery("select count(t) from " + type.getSimpleName() + " t where " + paramName + " = :x ");
修正后的完整GenericDaoImpl.java
package com.elfayq.stock.dao.impl; import com.elfayq.stock.dao.IGenericDao; import java.lang.reflect.Type; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import java.lang.reflect.ParameterizedType; @SuppressWarnings("unchecked") public class GenericDaoImpl<E> implements IGenericDao<E> { @PersistenceContext EntityManager em; private Class<E> type; public Class<E> getType() { return type; } public GenericDaoImpl() { Type t =getClass().getGenericSuperclass(); ParameterizedType pt=(ParameterizedType) t; type=(Class<E>) pt.getActualTypeArguments()[0]; } @Override public E save(E entity) { em.persist(entity); return entity; } @Override public E update(E entity) { em.merge(entity); return entity; } @Override public List<E> selectAll() { Query query=em.createQuery("select t from " + type.getSimpleName() + " t"); return query.getResultList(); } @Override public List<E> selectAll(String sortField, String field) { Query query=em.createQuery("select t from " + type.getSimpleName() + " t order by " + sortField + " " + field); return query.getResultList(); } @Override public E getById(Long id) { return em.find(type, id); } @Override public void remove(Long id) { E tab=em.getReference(type, id); em.remove(tab); } @Override public E findOne(String paramName, Object paramValue) { Query query=em.createQuery("select t from " + type.getSimpleName() + " t where " + paramName + " = :x "); query.setParameter("x", paramValue); return query.getResultList().size() > 0 ? (E) query.getResultList().get(0) : null; } @Override public E findOne(String[] paramName, Object[] paramValue) { if(paramName.length != paramValue.length) { return null; } String requete="select e from " + type.getSimpleName() + " e where "; int longeur = paramName.length; for(int i=0; i<longeur; i++) { requete+= "e." + paramName[i] + " = :x" + i; if(i+1< longeur) { requete+= " and "; } } Query query=em.createQuery(requete); for(int i=0;i<longeur;i++) { query.setParameter("x"+i, paramValue[i]); } return query.getResultList().size() > 0 ? (E) query.getResultList().get(0) : null; } @Override public int findCountBy(String paramName, String paramValue) { Query query=em.createQuery("select count(t) from " + type.getSimpleName() + " t where " + paramName + " = :x "); query.setParameter("x", paramValue); return query.getResultList().size() > 0 ? ((Long) query.getSingleResult()).intValue() : 0; } }
把这些地方都改完之后,重启你的项目,这个HTTP 500错误应该就解决了。本质就是字符串拼接时的空格遗漏,导致HQL语法错误,Hibernate无法识别实体。
内容的提问来源于stack exchange,提问作者Toto Hammad
相关产品推荐
相关产品推荐

