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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:00:12