Hibernate中对类进行查询,而不是对表查询

本文介绍了一种常见的Hibernate使用误区,即在JPA查询中直接使用数据库表名而非实体类名导致的映射异常,并提供了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错:

org.hibernate.hql.internal.ast.QuerySyntaxException: t_user is not mapped [updatePasswordByUsername......(省略)

解决办法:

将SQL中的表名换成实体类名。

问题情景:

public interface UserRepository extends CrudRepository<User, Integer> {

    /**
     * @Query("sql")
     *   sql中的update XXX 这里 XXX并不是指数据库中的表名称,而是对应实体中的类名。
     *   因为Hibernate是对类查询的 ,而不是对数据库表进行查询
     */

    @Query(" select t from t_user t")
    List<User> getList();

    @Transactional
    @Modifying
    @Query("update t_user t set t.password = :password where t.username = :username ")
    int updatePasswordByUsername(@Param("password") String password,
                                 @Param("username") String username);

    @Query(" select t from t_user t where t.username = :username")
    User selectOne(@Param("username") String username);
}

这是一段在SpringBoot中应用JPA的例子,t_user是数据库中的表名称,entity为User.class。

于是写过MySQL的,第一印象肯定是从表中查啊,于是就像上例一样。


因为Hibernate是对类查询的 ,而不是对数据库表进行查询,所以找不到t_user这个类,而且我们指定的是User
CrudRepository<User, Integer>。故此。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值