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

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 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")

你可能感兴趣的:(Spring,Data,JPA)