当前位置: 首页 > 知识库问答 >
问题:

无法使spring data jpa存储库上的自定义行为工作

邵亦
2023-03-14

我正在尝试将自定义行为添加到基本的 Spring 数据 JPA 存储库中,并且已经根据此处列出的文档完成了 http://docs.spring.io/spring-data/jpa/docs/1.2.0.RELEASE/reference/html/#repositories.single-repository-behaviour

然而,框架似乎没有将该方法识别为客户方法,而是试图解析该方法的名称并创建一个查询。我得到此错误:org . spring framework . data . mapping . propertyreferenceexception:没有首先找到com . Klein . spring MVC 1 . entity . category类型的属性

这是我的自定义界面:

package com.klein.springmvc1.dao;

import com.klein.springmvc1.entity.Category;

public interface CategoryRepositoryCustom {
    Category firstCategoryByName(String catagoryName);
}

下面是此接口的实现:

public class CategoryRepositoryCustomImpl implements CategoryRepositoryCustom {

@PersistenceContext(unitName="SpringMVC1")
EntityManager em;

private static final Logger logger = LoggerFactory.getLogger(CategoryController.class);


public Category firstCategoryByName(String catagoryName) {
    logger.debug("In my custom repo");
    Query q = em.createQuery("select category c from category where categoryName = " + catagoryName);
    @SuppressWarnings("unchecked")
    List<Category> categories = q.getResultList();

    if (categories.size() > 0) {
        return categories.get(0);
    }
    else 
        return null;
    }

}

以下是我的存储库的界面定义:

    public interface CategoryRepository extends CrudRepository<Category, Long>, CategoryRepositoryCustom {

    List<Category> findByCategoryNameIgnoreCase(String catagoryName);
    @Query("From Category c where c.categoryName like ?1%")
    List<Category> findCategoryByStartsWithCategoryName(String categoryName);
    List<Category> findByParentCategoryCategoryName(String categoryName);   
}

这是我的上下文配置:

   <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/data/jpa
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
        >
    <jpa:repositories base-package ="com.klein.springmvc1.dao"/>
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!--    <beans:bean id="customCategoryRepoImpl" class="com.klein.springmvc1.dao.CustomCategoryRepoImpl">
    </beans:bean>
     -->
    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven conversion-service="conversionService"  />


    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>


    <context:component-scan base-package="com.klein.springmvc1" />

    <beans:bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
        <beans:property name="formatters"> 
        <beans:set>
            <beans:bean class="com.klein.springmvc1.MyDateAnnotationFormatterFactory"/>
            <beans:bean class="com.klein.springmvc1.DateFormatter"/> 
        </beans:set>
        </beans:property>
    </beans:bean>


    <beans:bean id="exceptionTranslator" class="org.springframework.orm.hibernate4.HibernateExceptionTranslator" />

    <beans:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" /> 

    <beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" />

    <tx:annotation-driven/>

</beans:beans>

任何建议不胜感激。

共有1个答案

张兴旺
2023-03-14

默认情况下,< code>Spring-Data-JPA在实现自定义< code >存储库时,会查找带有< code>Impl后缀的< code >存储库,但由于您已将< code >命名为< code > categorypositorycustomimpl ,因此您需要将您的配置编辑为

 <jpa:repositories base-package ="com.klein.springmvc1.dao" repository-impl-postfix="CustomImpl"/>

关于添加自定义行为的更多信息:http://docs . spring . io/spring-data/JPA/docs/current/reference/html/# repositories . custom-implementations

 类似资料:
  • 在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS

  • 我使用的是Spring数据JPA1.10.11。释放 我有一个基础存储库,所有其他存储库都会扩展它。这部分有效。 我还想为一些要扩展的存储库声明一个自定义接口。所以我声明了一个接口和一个“Impl”类: 然后,我创建一个现有的工作存储库来扩展这个新接口: 注意:此存储库在扩展TestRepository之前工作,但是在如上扩展之后,应用程序上下文将无法以错误开始: 配置如下所示: 我觉得我一直在遵

  • 如果我试图使用命令上传一个jar 但我在Nexus Repository Manager OSS中找不到这个选项卡。这应该在tab摘要之后,但它不在那里。

  • 我发现对于减少样板非常有用,但它似乎给工作带来了麻烦。我现在试图用自定义的基类存储库扩展,而在启动时,Spring在正确实例化存储库方面遇到了问题。 我已经尝试了几个关于这个主题的变体,但是没有运气让事情成功地连线起来。我在Spring的问题跟踪器https://jira.spring.io/browse/datajpa-674上遇到了一个类似的问题,但没有关于修复的解释,只是对代码进行了重构,使

  • 我最终不得不在文件。定义通常非常繁琐: 注意上面gradle提供了一种定义常用maven存储库的好方法(即)。我想在插件或父gradle脚本中找到一种方法,在函数中或静态地定义存储库,然后在块中调用它:。 我缺乏groovy方面的知识,因此我不太了解解析groovy源代码所需的知识,我正在寻找一种很好的方法来实现这一点。我该怎么做? 我知道在父级gradle文件中,我可以使用或。我不想将这些mav

  • 如果你需要提供自定义文件存储 – 一个普遍的例子是在某个远程系统上储存文件 – 你可以通过定义一个自定义的储存类来实现。你需要遵循以下步骤: 1. 你的自定义储存类必须是django.core.files.storage.Storage的子类: from django.core.files.storage import Storage class MyStorage(Storage):