【问题标题】:Spring data JPA: find by column of custom class type's memberSpring data JPA:按自定义类类型成员的列查找
【发布时间】:2020-07-18 03:23:28
【问题描述】:

我有一个实体 Person,它有一个属性 Name。名称未标记为实体。对于 Name 类,我有一个 AttributeConverter,它通过名字和姓氏的字符串连接创建一个全名。所以对于 person 实体,列名的类型是 String。

@Entity
public class Person {
    // ...  
@Convert(converter = NameAttributeConverter.class)
@Column

private Name name;
    // ...
}

public final class Name implements Comparable, Serializable {
      // ...
      private String firstName;
      private String lastName;
      // ...
}

这行得通。但现在我想扩展我的个人存储库。我想按她的姓查找人。但是

List<Person> findByName_LastName(String lastName);

List<Person> findByNameLastName(String lastName);

不起作用。我得到以下异常:

PersonRepository.findByName_LastName(java.lang.String)! Illegal attempt to dereference path source [null.name] of basic type

我该如何解决这个问题?谢谢和问候

编辑:

public interface PersonRepository extends CrudRepository<Person, Long>{
    // The repository works without the findByName...
    // List<Person> findByName_LastName(String lastName);
}

【问题讨论】:

  • 显示您的个人存储库的其余部分。这也是一个数据库实体吗?
  • 这行不通。为什么不将 Name 定义为可嵌入的?
  • @SimonMartinelli 由于 AttributeConverter(我将其添加到代码示例中),这已经可以在没有嵌入的情况下工作。 findAll 之类的标准查询也有效。但是 findByNameLastName 不起作用...
  • 是的,为此您应该使用可嵌入的。这就是我要说的
  • @SimonMartinelli 你的意思是我应该把 Embeddable 放到 AttributeConverterClass 中?

标签: java spring jpa spring-data-jpa


【解决方案1】:

这不适用于查询派生,并且它不能工作,因为在一般情况下,在您的情况下,转换应用的函数是不可逆的。这意味着为了让 Spring Data 实现这一点,它需要分析转换,反转它,即创建一组函数,从存储在数据库中的连接字符串生成名字和姓氏,并使用 Criteria 实现它API。我认为这显然是做不到的。

如果您知道应该执行什么查询,请使用 @Query 注释。

更好的解决方案是将姓氏存储在单独的列中,以便轻松访问。

如果

【讨论】:

  • 感谢您的快速回复。 “转换应用的函数不可逆”是什么意思。例如在这种情况下可逆是什么意思?属性必须始终是实体类型,并且因为 Name 不是这样一个不起作用的实体吗?
  • 我更新了答案。我希望现在更清楚一点。
【解决方案2】:

由于您对name 列使用属性转换器,因此您将名字和姓氏视为数据库中的列。因此 JPA 将 name 视为 Name 类型的列,并且无法对 Name 对象类型字段进行查询。 更好的解决方案是将名字和姓氏存储在单独的列中,以便您可以轻松查询。但是如果你想创建一个名字和姓氏的字段并在 concat 字段上查询,那么你可以使用@Formula()

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Formula(value = "CONCAT(last_name, first_name)")
private String name;

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2014-02-03
    • 1970-01-01
    • 2015-03-25
    • 2015-12-07
    • 1970-01-01
    • 2019-07-14
    • 2012-09-13
    • 2019-03-10
    相关资源
    最近更新 更多