You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:57:57