带有收集结果的春季数据jpa @EntityGraph方法抛出BeanCreationException

时间:2019-01-31 20:59:32

标签: hibernate spring-boot spring-data-jpa

  

嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名称为'cityDao'的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalArgumentException:无法为方法public abstract java.util.List com.server.repository.location.CityDao.findAllWithCountry()创建查询!没有找到类型为City的属性findAllWithCountry!

@Transactional
public interface CityDao extends JpaRepository<City, Integer> {
    @EntityGraph(attributePaths = "country")
    List<City> findAllWithCountry(); //this one does not work

    @EntityGraph(attributePaths = "country")
    City findOneWithCountryById(int id); //this one works
}

实体:

@Entity
@Table(name = "city", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"country", "city_name", "latitude", "longitude"})
})
@Data
public class City {
    @ManyToOne(fetch = FetchType.LAZY)
    @NotNull
    @JoinColumn(name = "country")
    private Country country;
}

我正在尝试实现@EntityGraph以提高API性能。 第一种方法在工作时抛出BeanCreationException。唯一的区别是第一个返回集合,第二个返回单个实体。有办法解决吗?

1 个答案:

答案 0 :(得分:0)

关键问题不是country的{​​{1}}属性,请看一下堆栈跟踪:

City

这意味着它根本无法导出查询 ,更不用说找到No property findAllWithCountry found for type City! 属性了。

您可以覆盖默认的country

findAll

哪个优化将应用于您的所有@EntityGraph(attributePaths = "country") @Override List<City> findAll();

过去,当我遇到这种情况(我想拥有多个具有相同查询属性但每个注释都不同的派生方法)时,就是写customize the base repo或用{{1}写查询}。