【问题标题】:How do you create a Spring JPA repository findBy query using a property that contains a keyword?如何使用包含关键字的属性创建 Spring JPA 存储库 findBy 查询?
【发布时间】:2015-10-15 16:00:28
【问题描述】:

这是我的问题的简化示例。我有这个存储库和实体类。

public interface ThingRepository extends JpaRepository<ThingEntity, Long> {
    ThingEntity findByFooInAndBar(String fooIn, String bar);
}

@Entity
public class ThingEntity {
    @Column(name="FOO_IN", nullable=false, length=1)
    private String fooIn;

    public String getFooIn() {
        return fooIn;
    }

    public setFooIn(String fooIn) {
        this.fooIn = fooIn;
    }

    /* not including bar property for brevity's sake */
}

Spring 抛出以下异常。

org.springframework.data.mapping.PropertyReferenceException: No property foo found for type ThingEntity!

看起来 Spring 正在采用方法 findByFooInAndBar 并认为 foo 是我的属性名称,in 是用于匹配集合中值的关键字。

我如何理解属性名称是fooIn,而不是foo

【问题讨论】:

  • 我认为除了编写自己的方法之外没有其他方法可以绕过这种行为。或者只是将字段重命名为 fooin 可能没有大写?

标签: java spring-data-jpa


【解决方案1】:

为了克服这个问题,我使用@Query 注释手动定义了查询。如果他们找到不需要手动查询的解决方案,我会很乐意接受其他人的回答。

public interface ThingRepository extends JpaRepository<ThingEntity, Long> {

    @Query("SELECT t FROM Thing t WHERE t.fooIn = ?1 AND t.bar = ?2")
    ThingEntity findByFooInAndBar(String fooIn, String bar);
}

【讨论】:

    【解决方案2】:

    Spring 正在您的方法中解析“In”以创建查询。检查链接以创建您的查询:您应该将变量的名称 fooIn 更改为 fooin 或类似的名称...

    【讨论】:

      【解决方案3】:

      我仔细观察了代码,并注意到您的返回不是list,而是object
      将该部分更改为List&lt;ThingEntity&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-14
        • 2011-08-30
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        相关资源
        最近更新 更多