Spring Boot 当我在Repository接口中添加自定义方法时,应用程序无法启动

s6fujrry  于 2023-10-16  发布在  Spring
关注(0)|答案(4)|浏览(136)

我的应用程序在Repository中不包含任何自定义方法时运行良好。当我在repo接口中添加一个自定义repo方法时,它会给出异常,应用程序无法启动。

package com.library.repo;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.library.entity.ShowEntity;

@Repository
public interface ShowRepository extends JpaRepository<ShowEntity, Integer> {

    
    @Query("SELECT s FROM show_entity s WHERE s.movie.movie_id = :movieId")
    List<ShowEntity> findShowsByMovieId(int movieId);

}

控制台消息:

Error creating bean with name 'showController' defined in file [/Users/PR20372898/Documents/workspace-spring-tool-suite-4-4.15.1.RELEASE/XYZCinemas/target/classes/com/library/controller/ShowController.class]: Unsatisfied dependency expressed through constructor parameter 0: 

Error creating bean with name 'showService' defined in file [/Users/PR20372898/Documents/workspace-spring-tool-suite-4-4.15.1.RELEASE/XYZCinemas/target/classes/com/library/service/ShowService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'showRepository' defined in com.library.repo.ShowRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: 

Could not create query for public abstract java.util.List com.library.repo.ShowRepository.findShowsByMovieId(int); Reason: Validation failed for query for method public abstract java.util.List com.library.repo.ShowRepository.findShowsByMovieId(int)

出现此问题的可能原因是什么?我使用了所有的注解。请帮帮我

wnrlj8wa

wnrlj8wa1#

问题出在语法上,你写得不对。
正确的一个:

@Query("SELECT s FROM ShowEntity s WHERE s.movie.movie_id = :movieId")
    List<ShowEntity> findShowsByMovieId(@Param("movieId") Integer movieId);

要了解更多详细信息,请阅读documentation

dvtswwa3

dvtswwa32#

看起来你的查询语法中可能有一个bug。如果您试图从show_entity表中选择所有列,语法应该是:

@Query("SELECT * FROM show_entity s WHERE s.movie.movie_id = :movieId")
List<ShowEntity> findShowsByMovieId(@Param("movieId") int movieId);
wwtsj6pe

wwtsj6pe3#

Spring Data JPA已经提供了对基于方法名称的派生查询的支持。在这种情况下可以直接使用,如下所示,通过电影ID检索记录。

@Repository
public interface ShowRepository extends JpaRepository<ShowEntity, Integer> {
    List<ShowEntity> findByMovieId(int movieId);
}

但是如果您仍然希望使用@Query注解,则需要了解JPQL(Java持久化查询语言)和本机查询之间的区别。可以在JPQL中将查询重写为:

@Query("SELECT s.* FROM ShowEntity s WHERE s.movieID = :movieId")
List<ShowEntity> findShowsByMovieId(@Param("movieId") int movieId);

使用本机查询时,查询应更新如下:

@Query("SELECT s.* FROM show_entity s WHERE s.movie_id = :movieId", nativeQuery = true)
List<ShowEntity> findShowsByMovieId(@Param("movieId") int movieId);

我建议您仔细阅读文档,以更深入地了解这个主题。

szqfcxe2

szqfcxe24#

从docs

@Query("SELECT s FROM ShowEntity s WHERE s.movie_id = ?1")
List<ShowEntity> findShowsByMovieId(int movieId);

第二种方式:

@Query("SELECT * FROM show_entity s WHERE s.movie_id = :movieId", nativeQuery = true)
List<ShowEntity> findShowsByMovieId(@Param("movieId") int movieId);

相关问题