在 JPA 中调用方法

2022-09-04 04:18:20

我正在将ObjectDB与JPA一起使用。我想调用 myMethod()。例如:

entityManager.createQuery("SELECT ... FROM ... WHERE MyClass.myMethod() = 100")

可能吗?也许在类中的方法之前需要任何注释?

@Entity
public class MyClass implements Serializable {

    @Basic 
    private int x;

    @Basic
    private int y;

    public int myMethod() {
        return x*1000+y;
    }
}

答案 1

JPQL 并不完全是基于对象的查询语言。您无法定义自己的方法,而 JPQL 提供了一组非常有限的函数。因此,如果您想保持在JPA规范范围内,那么答案是否定的;必须是特定于JPA实现的 - DataNucleus JPA当然允许您在查询语言中拥有自己的方法(作为供应商扩展),不知道您引用的JPA提供程序 - 话虽如此,但如果您将该方法的代码放在查询方法实现中(而不是在类中),它只会在数据存储中执行此类查询


答案 2

是的,你可以!并且不需要其他注释。

ObjectDB面向对象的数据库系统(OODBS)的实现,因此允许您将数据库项作为对象进行交互,包括调用方法,使用继承和多态性等。

这是我有的一个简单的工作示例。使用这样的类:

@Entity
public class Person {
    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private long id;

    private String firstName;
    private String lastName;

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }
}

此查询返回正确的结果:

entityManager.createQuery(
    "SELECT p FROM Person p WHERE p.getFullName()='John Johnson'", Person.class).getResultList();