我有一个实体 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);
}
最佳答案
这不适用于查询派生,并且它无法工作,因为一般情况下以及在您的情况下,转换所应用的函数是不可逆的。这意味着为了让 Spring Data 实现这一点,它需要分析转换,将其反转,即创建一组函数,从存储在数据库中的连接字符串中生成名字和姓氏,并使用 Criteria 来实现它API。我认为这显然是不可能做到的。
如果您知道应该执行什么查询,请使用@Query
注释。
更好的解决方案是将姓氏存储在单独的列中,以便可以轻松访问。
如果
关于java - Spring 数据JPA : find by column of custom class type's member,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61054549/