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

时间:2017-08-28 07:43:07

标签: jpa jpql

如何在JPA查询中添加额外的列?
假设我们有一个通过以下伪代码创建的表“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
}

请注意,表格中没有“年龄”字段 我想使用

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

并计算数据库的年龄

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

3 个答案:

答案 0 :(得分:0)

我可以用这种方式解决这个问题:

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

修改

  

导致ORA-00923:FROM关键字找不到预期的My Query   文字是: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
//--------------------------------^^^

答案 1 :(得分:0)

可能使用DB-View可能有所帮助。您希望实体可更新吗?从一种“维护”实体派生的“只读”实体是否合理?通过将数据库视图用作@Table来包含计算列?

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

实体:

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

如果你不想要两个不同的Entity-Classes(即使一个派生自另一个),那么JPA如何允许更新视图,如果dbms支持它(oracle确实如此),我需要进行一些探索。没有经验,对不起。

答案 2 :(得分:0)

问题解决了。
查询文本如下:

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