当前位置: 首页 > 知识库问答 >
问题:

Spring data JPA:按自定义类类型成员的列查找

安高义
2023-03-14

我有一个实体Person,它有一个属性Name。name没有被标记为实体。对于Name类,我有一个属性转换器,它通过名字和姓氏的字符串连接创建一个全名。所以对于个人实体,列名是字符串类型。

@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);
}

共有2个答案

符风畔
2023-03-14

您将firstname和lastname视为数据库中的一列,因为您将Attribute converter用于name列。因此,JPA将name视为名称object-type字段类型的列,无法查询 对象类型字段。更好的解决方案是将firstname和lastname存储在单独的列中,以便您可以轻松查询。但是,如果您想对firstname和lastname进行字段concat并对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;
牟稳
2023-03-14

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

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

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

如果

 类似资料:
  • 问题内容: 我有一个名为“威士忌制造商”的课程,它只会启动新的威士忌。现在,我想在“ WhiskyOverViewController”中添加新添加的威士忌。但是我面临以下问题: 在“ stringArray”行中,出现错误“实例成员’whiskyArray’无法用于类型’WhiskyOverViewController’。为什么不能在那里使用whiskyArray变量? 在此先感谢您的帮助 问题

  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。

  • 存在多种方法来重新定义现有类型的行为以及提供新的类型。 重写类型编译 一个常见的需求是强制更改类型的“字符串”版本,即在create table语句或其他SQL函数(如cast)中呈现的版本。例如,应用程序可能希望强制呈现 BINARY 适用于除一个平台外的所有平台 BLOB 待渲染。在本例中,使用现有的泛型类型 LargeBinary ,是大多数用例的首选。但是为了更准确地控制类型,每个方言的编

  • 1. 包含头文件 #import <AdHubSDK/AdHubSDK.h> 2. AdHubCustomView 的创建和初始化 在需要导入广告的ViewController头文件中导入头文件并声明实例以及声明代理 #import <AdHubSDK/AdHubSDK.h> @interface AdHubCustomViewController ()<AdHubCustomViewDele

  • 我在我的wordpress网站上创建了一个自定义帖子类型“Portfolio”,还为这个自定义帖子类型创建了一个类别部分,其中包含类别slug“PortCate”。 “Portfolio”帖子的永久链接如下: mysite.com/portfolio/post-name/ 但是类别url是 mysite.com/port-cate/category-slug/ 我的问题是:如何为这种帖子类型创建分

  • 但有些时候我们需要控制枚举的类型,那么我们可以 Enum 派生出自定义类来满足这种需要。通过修改上面的例子: #!/usr/bin/env python3 # -*- coding: UTF-8 -*- from enum import Enum, unique Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Au