Spring Data JPA @Query注解查询报错:无法解析实体RESTAURANT
解决Spring Data JPA @Query注解中实体无法解析的问题
问题现象
启动Spring Boot应用时抛出异常,核心错误信息为:
org.hibernate.query.sqm.UnknownEntityException: Could not resolve root entity 'RESTAURANT'
该异常出自自定义的RestaurantRepository接口,由@Query注解定义的findBySearchQuery方法触发。
问题根源
JPQL(Java Persistence Query Language)语法要求查询语句中引用实体类名称(对应Java类名,如Restaurant),而非数据库表名(如RESTAURANT)。原代码错误使用了数据库表名RESTAURANT,导致Hibernate无法匹配到对应的实体类。
修复方案
修改@Query注解内的JPQL语句,将FROM RESTAURANT r替换为FROM Restaurant r,确保引用的是实体类名称。
修正后的仓库接口代码
package com.QuickBite.QuickBite.repository; import com.QuickBite.QuickBite.model.Restaurant; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface RestaurantRepository extends JpaRepository<Restaurant, Long> { @Query("SELECT r FROM Restaurant r WHERE lower(r.name) LIKE lower(concat('%', :query, '%')) " + "OR lower(r.cuisineType) LIKE lower(concat('%', :query, '%'))" ) List<Restaurant> findBySearchQuery(String query); Restaurant findByOwnerId(Long userId); }
补充说明
如果需要直接操作数据库表和字段(使用原生SQL),可以在@Query注解中添加nativeQuery = true参数,此时需确保语句中使用数据库表名和字段名:
@Query(value = "SELECT * FROM RESTAURANT r WHERE LOWER(r.name) LIKE LOWER(CONCAT('%', :query, '%')) " + "OR LOWER(r.cuisine_type) LIKE LOWER(CONCAT('%', :query, '%'))", nativeQuery = true) List<Restaurant> findBySearchQuery(String query);
但优先推荐使用JPQL,它与数据库无关,更符合ORM的设计理念。
内容的提问来源于stack exchange,提问作者Akshata Kotti
相关产品推荐
相关产品推荐

