【问题标题】:Could not create query metamodel Spring Data JPA repository (Weird behaviour)无法创建查询元模型 Spring Data JPA 存储库(奇怪的行为)
【发布时间】:2018-11-23 09:24:50
【问题描述】:

我的 JPA 存储库中出现意外错误。由于与 JPA 相关的异常,Spring 无法创建 repo bean。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fooRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract com.xxxxx.entities.Foo com.xxxxx.repositories.FooRepository.findByCourierId(java.lang.Long)!
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)

Caused by: java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract com.xxxxx.entities.Foo com.xxxxx.repositories.FooRepository.findByCourierId(java.lang.Long)!
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:97)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:206)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:73)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:367)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:190)
Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [courierId] on this ManagedType [com.xxxxx.core.models.XXXObject]

我的回购代码如下:

public interface FooRepository extends XXXRepository<Foo> {

    Foo findByCourierId(Long courierId);

    @Query("SELECT CA " +
        "FROM Foo CA " +
        "WHERE CA.courier.id IN (?1)")
    List<Foo> findByCourierIds(List<Long> courierIds);
}

现在奇怪的是,在添加第二种方法之前,它会显示第一个查询的错误,该查询可以完美找到,如果我删除第二个查询,代码可以正常工作。

实体的代码是这样的

@Entity
public class Foo extends XXXObject {

    @OneToOne
    @JoinColumn(name = "courier_id")
    private Courier courier;
....

【问题讨论】:

  • Foo 没有属性courierId,只有courier。除非您的 Courier 类具有属性 id,否则异常会准确地告诉您问题所在。
  • 但我不明白为什么如果我删除第二个查询它会起作用。 findByCourierIds。这是我的问题,在我添加第二个查询之前,它能够从courier 表映射courierId

标签: java mysql spring spring-data-jpa spring-data


【解决方案1】:

代替

public interface FooRepository extends XXXRepository<Foo> {

你可以使用 JPARepository

 public interface FooRepository extends JpaRepository<Foo, Long> {

【讨论】:

  • 是的,但是XXXRepository 已经扩展了JpaRepository&lt;Foo, Long&gt;
  • 对不起。这没有被提及,所以没有意识到这一点。
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
相关资源
最近更新 更多