【问题标题】:How to write Query Method on a subclass object using spring data jpa?如何使用spring data jpa在子类对象上编写查询方法?
【发布时间】:2021-09-07 17:00:06
【问题描述】:

我想通过 spring data jpa 中的查询方法从子类中获取数据。不想使用 jpql 或标准 api。我想获取具有指定帐户类型和用户的所有连接。我知道 jpql 以及标准 api 会完成这项工作,但我想用 JPA 查询方法来实现这一点。以下是我的实体代码和存储库。

这是主要的实体类

@Entity
public class Connection {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    @Column(name = "Connection_Id", nullable = false, updatable = false)
    private String id;

    @Column(name = "User_Id", nullable = false)
    private String userId;

    @Column(name = "Name", nullable = false, length = 64)
    private String name;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "Connection_Type_Id")
    private ConnectionType connectionType;
    
    // default constructor
    
    // getter and setter
    
    }

这是抽象和具体的实体类

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class ConnectionType {

    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(
            name = "UUID",
            strategy = "org.hibernate.id.UUIDGenerator"
    )
    @Column(name = "Id", nullable = false)
    private String id;

    @OneToOne(mappedBy = "connectionType")
    private Connection connection;
    
    // default constructor
    
    // getter setter
}

@Entity
public class EmailAccount extends ConnectionType {
    
    @Column(name = "Username", nullable = false)
    private String username;
    
    @Column(name = "Password", nullable = false)
    private String password;
    
    
    @Column(name = "Account_Type", nullable = false)
    @Enumerated(value = EnumType.STRING)
    private AccountType accountType;
    
    @Column(name = "FullName")
    private String fullName;
    
    // default constructor
    
    // getter setter
    
}

@Entity
public class OtehrAccount extends ConnectionType {

    @Column(name = "Client_Id", nullable = false)
    private String clientId;
    
    @Column(name = "Client_Secret", nullable = false)
    private String secret;
    
    // default constructor
    
    // getter and setter
    
}

下面是仓库

public interface ConnectionRepository extends JpaRepository<Connection, String> {

    // Query Method that i want to write but is not valid.
    List<Connection> findByUserIdAndconnectionTypeAccountType(String userId, AccountType accountType);

}

repo 中的 findByUserIdAndconnectionTypeAccountType 方法不正确,所以我只想知道天气是否可以编写基于子类属性得到结果的方法?

【问题讨论】:

    标签: java spring hibernate jpa spring-data-jpa


    【解决方案1】:

    findByUserIdAndconnectionTypeAccountType 表示您要获取连接 通过 userId 和 AccountType 实体 ConnectionType 的字段在哪里。

    • 类 ConnectionType 没有您想通过 AccountType 获取连接的名称为 AccountType 的属性。
    • AccountType 是类 ConnectionType 的子类的属性。 所以 connectionTypeAccountType 不正确。
    • AccountType 是实体的属性 EmailAccount 在扩展 ConnectioType 的地方,您无法使用 AccountTypeConnection /em>

    【讨论】:

    • 我知道。我想知道是否可以通过查询方法完成。
    【解决方案2】:

    澄清一下,“JPA 查询方法”实际上是“Spring Data JPA 查询方法”,所以这不是 Hibernate 问题。在 JPQL/HQL 中,这种子类型访问通常通过使用 TREAT 运算符来工作,或者在 HQL 的情况下,它也隐式工作。由于 Spring Data JPA 文档没有提到处理运算符,我想说这是不可能的:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2016-04-16
      • 1970-01-01
      • 2017-11-23
      相关资源
      最近更新 更多