【问题标题】:Trouble adding custom methods to spring jap repositories将自定义方法添加到 spring jpa 存储库时遇到问题
【发布时间】:2016-06-16 09:23:24
【问题描述】:

我的 Spring JPA 存储库正在运行,但我无法在其中创建自定义方法,如下所示是我的简单存储库

@Repository
public interface UserRepository extends CrudRepository<JPA_Users, Long> {

    List<JPA_Users> findByName(String Name);

}

然后在我的控制器类中我声明变量 CrudRepository 存储库;

实例化了

ApplicationContext context = new ClassPathXmlApplicationContext("beans1.xml"); 
repository = context.getBean(UserRepository.class);

现在我期待我可以通过使用 repository.findByName 来获得它,但我没有找到

我正在浏览许多他们想要服务的文章,然后是它的实施,然后他们进行自动装配,我没有得到任何想法。请指导我声明一个自定义 JPA 存储库方法

请注意,我有 XML,其中声明了 jpaVendorAdapter EntityManagerFactory 等并按预期工作我有简单的存储库,通过我可以执行 CRUD

沙赫扎德

【问题讨论】:

  • 请不要告诉我您实际上是在再次创建上下文实例来检索依赖项?除非你想要奇怪的内存、事务、并发问题,否则使用依赖注入。
  • 您需要将变量声明为 UserRepository 存储库而不是 CrudRepository 存储库。正如 M. Deinum 所提到的,您只需要创建一个包含所有 bean 的上下文 - 存储库、控制器和您需要的任何其他内容(而不是在控制器中创建上下文)。
  • Michal 感谢您指出我的错误 User Repository 工作,现在该对象具有 findByName 函数但现在我有更多问题,请注意我在存储库中声明函数为 List findByName(String Name);我进行了以下调用 Iterable usrs = repository.findByName("shahzad");我期待记录列表将被返回。我有多个带有 Shahzad 名称列 M.Deinum 的记录,我在 spring 和 java 中有点新,通常我只是按照分步说明进行操作,请你给我更多的教育
  • 对于您的第二个问题,您能否也粘贴 JPA_Users 类?

标签: java spring repository


【解决方案1】:

如果您已经将 beans1.xml 连接到您的应用程序上下文,则在您的控制器中声明存储库,如下所示:

@Autowired
private UserRepository repository;

否则,在您的代码示例中,您应该将“存储库”变量声明为 UserRepository 的实例:

UserRepository repository = (UserRepository) context.getBean(UserRepository.class);

因为如果你声明为 CrudRepository,父类可以成功转换,但会丢失你接口的签名。

【讨论】:

  • 是的,我明白了,但我还有另一个问题,我在上面的 cmets 中针对两个 cmets 编写了该问题。能否请您提前评论一下,谢谢:)
  • 我明白了。你能把代码也贴一下吗,我有点困惑你的下一个问题是什么?
  • LynxZh autowired 也让我有些困惑。我有 MVC 应用程序,在我的控制器函数 RequestMapping 到一个 URL 中,我将应用程序上下文创建为 ApplicationContext context = new ClassPathXmlApplicationContext("beans1.xml");我不能在 RequestMapping 函数中声明 Autowired 我应该在哪里声明 autowired 变量。我试图在类声明下声明它,但这给出了错误。请指导
  • 默认情况下,应用程序上下文是在 spring 应用程序加载期间和 webcontext 初始化期间创建的。如果您基于自己的 beans1.xml 创建 applicationcontext,那么它只存在于控制器的上下文中。因此,在这种情况下,您不会自动装配它,因为控制器中的自动装配上下文正在使用 webcontext。您可以使用#2 方式来做到这一点。
  • 请看我的评论,请同时粘贴 JPA_Users。
【解决方案2】:

LynxZh 我的代码很简单,我有存储库

@Repository
public interface UserRepository extends CrudRepository<JPA_Users, Long> {

    List<JPA_Users> findByName(String Name);

}

然后我有一个具有以下请求映射函数的控制器类

  @RequestMapping(value = "/jpadata1", method = RequestMethod.GET)
   public String jpadata1(ModelMap map) {        
        UserRepository repository;


        //Remember     beans1.xml is located in src/main/resources   folder    but 
        //load with just beans1.xml
        ApplicationContext context = new ClassPathXmlApplicationContext("beans1.xml"); 
        repository = context.getBean(UserRepository.class);

你可以看到我有我的存储库然后我调用了以下函数

Iterable usrs = repository.findByName("jpa data");

并期望所有名为 shahzad 的记录都将返回,但它不返回任何记录

【讨论】:

  • 您可以编辑原始问题并将其放在原始问题下方。
猜你喜欢
  • 2016-05-14
  • 2016-07-10
  • 2017-12-03
  • 2012-08-06
  • 2022-12-01
  • 2012-10-31
  • 2015-06-16
相关资源
最近更新 更多