14

我将 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;
    }
}
4

5 回答 5

5

JPQL 不完全是一种基于对象的查询语言。您不能定义自己的方法,并且 JPQL 提供的功能非常有限。因此,如果您想遵守 JPA 规范,那么答案是否定的;必须是特定于 JPA 实现的 - DataNucleus JPA 当然允许您在查询语言中拥有自己的方法(作为供应商扩展),不知道您引用的 JPA 提供者 - 尽管如此,它只会执行这样的查询如果将该方法的代码放在查询方法实现中(而不是在类中),则为数据存储

于 2012-10-21T10:22:14.633 回答
3

是的你可以!并且不需要额外的注释。

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();
于 2019-01-04T22:44:23.847 回答
1

JPQL 被翻译成 SQL,因此您不能包含 Java 方法调用,因为您的数据库(很可能)不支持 Java。

在 JPA 2.1 中,您将能够使用 FUNCTION 运算符来调用“数据库”函数。一些数据库确实支持在 Java 中定义函数,但通常使用专有的数据库语言(例如 PL/SQL)。

EclipseLink 支持 FUNC 和 FUNCTION 运算符来调用数据库函数。您还可以使用 OPERATOR 运算符定义自己的运算符,它允许您在 Java 中定义自己的自定义数据库函数调用。

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#EclipseLink_special_operators

于 2012-10-22T14:49:20.167 回答
-1

不是您正在寻找的方式。如果您想使用自定义方法,您可以在使用它们之前创建并注册它们。

例如创建如下函数:

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

registerFunction()然后使用dialect您的数据库注册此函数。完成后,您可以将查询编写为:

  from MyClass data where myMethod(data.x, data.y) =100;

锄头这有帮助。

于 2012-10-21T00:02:10.060 回答
-1

不,你不能那样做。由于 JPA 始终使用准备好的语句(参数化 SQL),因此您只能WHERE在 JPQL 查询的子句中设置参数,例如

entityManager.createQuery("SELECT .... FROM ... WHERE  
someCondition=:someValue).setParameter("someValue", "parameterValue");

使方法 ( myMethod()) 以某种方式返回该值,并将方法的第二个参数替换为您parameterValuesetParameter()方法返回的值myMethod()

于 2012-10-21T00:40:30.183 回答