【问题标题】:Spring Hibernate - FindByObject CrudRepositorySpring Hibernate - FindByObject CrudRepository
【发布时间】:2017-04-25 03:22:02
【问题描述】:

是否有可能(如果有,如何)在 CrudRepository 接口中添加自定义方法?

我有以下 DAO,其中包含一个名为 Foobar 的实体类。为了这个问题 - 实体类可以有任意数量的字段/列。

package com.bar
import org.springframework.data.repository.CrudRepository;
import com.bar.Foobar
public interface FoobarCrudRepo extends CrudRepository<Foobar, Long> {
    public Foobar findByObject(Foobar JObj);
}

如果您删除该自定义方法,此代码可以正常工作,但如果我添加它会引发错误(如上所示)。我从这篇文章 (Update or SaveorUpdate in CRUDRespository, Is there any options available) 的理解是,我只需要向接口添加一个额外的方法(如示例所示),其余的由 JPARepo 处理。但是,我收到以下错误。我的想法 - 它对这个自定义类知之甚少。

这是我的错误:

nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Foobar': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property object found for type Foobar!

您可能会问,为什么我需要一个 findbyObject()?这样我就不会通过检查数据库以查看对象是否已添加并执行检查来将重复的数据行插入数据库。

任何建议都会有所帮助,谢谢。

【问题讨论】:

  • 您想通过使用整个对象作为键来检查对象是否存在于数据库中?为什么没有唯一 ID?
  • 不是作为键,而是作为对象。据我了解,uniqueID 是在插入数据库后生成的,而不是之前生成的。也就是说,我如何才能在插入之前找到 uniqueID?
  • 要做你想做的事,你几乎只需要选择需要唯一的字段以使对象是唯一的,然后将这些字段与当前数据库中的内容进行检查。跨度>
  • 在网上搜索了一段时间后,我同意你和 jWest 的看法。这听起来几乎像一个“构造函数”(不完全是)被放置在这里。是否可以在调用此 DAO 的服务层类中放置一个 if 语句?
  • 这和休眠有什么关系?

标签: java spring hibernate


【解决方案1】:

FindByObject 不查找对象,它实际上是在您的 Foobar 类中查找名为 Object 的字段。就像其他人提到的那样,您可以检查对象的其他字段以查看它是否已经存在。

例如,如果您的Foobar 类有String nameString email 字段,您可以创建一个类似public Foobar findByNameAndEmail(String name, String email) {} 的方法,如果数据库中有符合这些条件的记录,这将返回一个Foobar 对象标准。

所有查询方法都是复制 SQL,所以问问你自己,你能在 SQL 中“按对象(记录)查找”吗?不,因为那没有意义。您的查询将返回满足某些条件的记录(对象)。

【讨论】:

  • 令人惊讶的是,Hibernate 没有考虑这种情况——举个简单的例子,假设员工和部门之间的关系是 M:1。在 SQL 中,您将在一个上插入有关员工的信息,在另一个上插入有关部门的信息。在员工表上,您可以通过共享 FK 部门 ID 让多个员工属于同一部门。这样,您可以重用部门表中的行。
  • 您可以使用@ManyToOne 注释在Hibernate 中执行您所说的操作。我建议您了解更多有关 Hibernate 的信息,因为它非常灵活且相当简单,您可以在完全输入的 SQL 中执行所有操作。
  • 我仍在尝试学习休眠,但它仍然会添加重复的行,即使使用 @ManyToOne 注释
【解决方案2】:

您的代码不起作用,因为它采用 findBy 后面的名称并尝试使用它创建 where 条件。

所以 findByObject 创建:

where object = ?

通过 id 查找对象,您可以调用

findOne(?)

【讨论】:

  • 这个问题是 findOne() 必须接受与数据类型匹配的参数 ID(在这种情况下,它是 Long)。由于我是按对象搜索,所以它无效。
  • 当然,但你有对象可以获取 Id 并将其作为参数传递。我没有看到问题
  • 我没有 ID - 它是在插入时创建的,并且在此之前我有对象。
  • 那么 findByObject 应该怎么做呢?在所有其他领域找到它?你在那个对象中有一个独特的字段吗?
  • 没错,似乎最好的方法是通过对象拥有的所有字段。所以在 SQL 中,它会是这样的:选择 [whatever] form table where fieldA=?和字段B =?等等。我不能假设我在这些对象中有一个唯一的字段,但关键是无论如何都要减少重复的数量。
猜你喜欢
  • 2017-10-01
  • 2018-02-04
  • 1970-01-01
  • 2014-12-30
  • 2014-06-24
  • 2017-07-04
  • 2014-06-13
  • 2016-07-01
  • 1970-01-01
相关资源
最近更新 更多