Java Spring数据JPA:按自定义类类型的列查找';s成员

Java Spring数据JPA:按自定义类类型的列查找';s成员,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我有一个拥有财产名称的实体人。名称未标记为实体。对于Name类,我有一个AttributeConverter,它通过名字和姓氏的字符串连接来创建全名。因此,对于person实体,列名的类型为String @Entity public class Person { // ... @Convert(converter = NameAttributeConverter.class) @Column private Name name; // ... } public final

我有一个拥有财产名称的实体人。名称未标记为实体。对于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;
      // ...
}
这很有效。但是现在我想扩展我的person存储库。我想按她的姓找人。但是

List<Person> findByName_LastName(String lastName);
我怎样才能解决这个问题?谢谢和问候

编辑:

公共接口PersonRepository扩展了Crudepository{
//存储库在没有findByName的情况下工作。。。
//列出findByName_LastName(字符串LastName);
}

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

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

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


若将firstname和lastname视为数据库中的一列,因为您对
name
列使用了属性转换器。因此,JPA将
name
视为类型为
name
的列,不能查询
name
对象类型字段。 更好的解决方案是将firstname和lastname存储在一个单独的列中,以便您可以轻松地进行查询。但是,如果您想创建一个包含firstname和lastname的字段concat并查询concat字段,那么您可以使用
@Formula()

@列(name=“first\u name”)
私有字符串名;
@列(name=“last_name”)
私有字符串lastName;
@公式(value=“CONCAT(姓、名)”
私有字符串名称;

显示个人存储库的其余部分。这也是db实体吗?这将不起作用。为什么不将Name定义为可嵌入的?@SimonMartinelli由于AttributeConverter(我将其添加到代码示例中),在没有可嵌入的情况下,它已经可以工作了。像findAll这样的标准查询也可以工作。但是findByNameLastName不起作用……是的,为此您应该使用Embeddeble。我就是这么想的saying@SimonMartinelli你是说我应该将Embeddeble放入AttributeConverter类?谢谢你的快速回复。“转换应用的函数是不可逆的”是什么意思?例如,在本文中,什么是可逆的?属性必须始终是一个实体类型,并且因为名称不是这样一个不起作用的实体吗?我更新了答案。我希望现在更清楚一点。
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);
}