欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Data JPA中使用JPQL语句查询问题——XXX is not mapped(当你怎么改语句都没用时。。)

程序员文章站 2022-03-02 17:17:49
...
Spring Data JPA中使用JPQL语句查询问题——XXX is not mapped(当你怎么改语句都没用时。。)

实体类

@Data//自动生成get/set/tostring
@Entity(name = "tab_admin")//交给jpa管理实体,并设置映射到数据库的表名(坑)
public class FairyAdmin {
	//字段省略...
}

Dao

@Repository
public interface FairyAdminDao extends JpaRepository<FairyAdmin,Integer> {

    //使用JPQL查询
    //@Query(value = "select a from FairyAdmin a where a.adminUsername like %?1%")
    //public List<FairyAdmin> myFindAllByUsernameLike_JPQL(String username);

    @Query("select a from FairyAdmin a")
    List<FairyAdmin> myFind();
}

看起来一切OK?

结果:测试运行时一直提示错误

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException
org.hibernate.hql.internal.ast.QuerySyntaxException: XXX is not mapped

反复的检查JPQL语法,没问题啊,网上查找类似的问题,也就是一直说需要写上实体类的类名,我也写上了啊,(我甚至还考虑到是不是LomBok的锅。。徒劳。。)但为什么还是出错呢?

终极原因

在JPQL语法中,select a from 类名 a 这语句中的类名其实不只是参照你的实体类名,他会优先参照的是你在实体类上使用的注解@Entity(name = "tab_admin")中的自定义name字段,因此,修改JPQL语句

@Query("select a from tab_admin a")
List<FairyAdmin> myFind();

这样子终于能查询出来了!好坑啊有木有!!!花了2小时找这BUG真的难受。。。网上怎么没人和我一样碰到呢,QAQ。。

还有个建议,在实体类上不要使用@Entity(name = "tab_admin")来标注名称,需要指定映射的数据库名,最好使用@Table(name="XXX")