JPA通过调用函数添加额外字段

JPA Add extra fields by calling a function

如何在 JPA 查询中添加额外的列?
假设我们有一个 table "users" 通过以下伪代码创建:

create table users(name,birthdate);

用户 jpa 实体是这样的:

@Entity
@Table("users")
public class User {

    @Basic
    @Column
    private String name;

    @Basic
    @Column
    private Date birthDate;

    @Transient
    private int age;

    //getters and setters are here
}

请注意 table
中不存在年龄字段 我想使用

在 JQL 中编写以下查询
entityManager.createQuery(jql)

并通过数据库计算年龄

select u.*, sysdate-u.birthdate age from users

通常我是这样解决这个问题的:

select new name.of.package.users(u.*, sysdate - u.birthdate as age) from users u;

编辑

It leads to ORA-00923: FROM keyword not found where expected My Query text is : String jql = "select new entity.User(u.*, sysdate-u.birthdate as age) from User u";

查询包含一个错误:

select new entity.User(u.*, sysdate-u.birthdate as age) from User u
//--------------------------------^^^

可能使用 DB-View 可能会有帮助。您希望实体可更新吗?从一种 "maintenance" 实体派生出一个 "readonly" 实体是否合理,该实体将通过使用数据库视图作为 @Table 来包含计算列?

create view usersview as name, birthdate, sysdate - birthdate as age from users;

实体:

@Entity
@Table("usersview")
public class UserExtended extends User {

如果您不想要两个不同的 Entity-类(即使一个是从另一个派生的),如果 dbms 支持,则需要探索 JPA 如何允许更新视图( oracle 有),我没有这方面的经验,抱歉。

问题解决
查询文本类似于:

String jql = "select NEW entity.User(u.id, u.name, u.birthDate, sysdate-u.birthDate as age) from User u";


并且还将适当的构造函数添加到实体

public User(int id, String name, Date birthDate, double age) {
    this.id = id;
    this.name = name;
    this.birthDate = birthDate;
    this.age = age;
}

并使用 entitymanaget.createQuery(jql) 而不是 createNativeQuery