【问题标题】:How to write Spring Data method name to retrieve all elements in a column?如何编写 Spring Data 方法名称来检索列中的所有元素?
【发布时间】:2013-08-11 08:15:57
【问题描述】:

假设我有课:

@Entity
public class Bean {
    @Id
    private String beanId;
    //other fields & setters and getters
}

以及相应的 Spring Data JPA 存储库,我希望在其中有一个 List<String> 所有的 beanIds

@RepositoryDefinition(domainClass = Bean.class, idClass = String.class)
public interface BeanRepository {
    @Query("select b.beanId from Bean b")
    List<String> findAllBeanId();
}

如上所述,一切都按预期进行;但这是一个简单的操作,我不想显式编写查询。该方法的名称应该是什么,以便 Spring Data 可以解析它并获得上述查询(或相同的功能)。我已经在这两个参考文档中搜索了两本关于 Spring Data 的书。上述名称(findAllBeanId)和我尝试过的其他名称(findBeanIdfindBeanBeanId 等)引发以下异常作为根本原因:

org.springframework.data.mapping.PropertyReferenceException: No property find found for type Trade
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:72)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:68)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:57)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:279)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:147)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:153)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:43)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 22 more

【问题讨论】:

    标签: java spring jpa orm spring-data


    【解决方案1】:

    您展示的代码可以/应该按预期工作。它根本不会导致您看到的异常:)。

    例外是指Trade,这似乎表明您在某处有一个Trade 的存储库,它似乎指的是缺少的属性。您显示的代码绝对不是导致异常的代码。实际上情况并非如此,因为您手动定义查询,因此查询派生机制甚至不会为您显示的存储库启动。

    我已经推送了一个test case 让你看到它的实际效果。

    【讨论】:

    • 我已经提到代码按预期工作:“如上所述,一切按预期工作”。我实际上是在寻找一种在没有注释的情况下实现功能的方法,但正如我从上面的答案和您的评论中了解到的那样,它不受支持(我相信您是 Spring Data 的作者之一 Oliver Gierke,所以我相信您的话);感谢您有兴趣为框架提供支持并继续努力!
    【解决方案2】:

    在 Spring 文档中:http://static.springsource.org/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html 没有关于通过从方法名称生成的查询从实体中获取特定列/属性的信息。所以我认为目前是不可能的。

    【讨论】:

    • 我已经搜索了文档以及关于 Spring Data 的两本书,但也没有找到;但这并不一定意味着它不支持它。支持更复杂的功能而不支持这个相当简单的功能会有点奇怪。
    • 这将是一个不错的功能,但恕我直言,实现起来并不容易。目前 fetch 方法可以返回单个实体或实体列表。使用此扩展,将允许任何返回类型,但也应根据实体中的选定属性进行验证。如果只选择一个属性/列,方法签名很漂亮,但对于两个或更多,它将是 Object[] 或 List 是讨厌的。
    • 是的。目前查询派生机制不支持投影,但如果您手动定义查询,您实际上可以使用原始海报所示的查询声明。他看到的异常不是由他显示的代码引起的,请参阅我对该主题的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2020-08-24
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多