Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA中的Call方法_Java_Jpa_Methods_Objectdb - Fatal编程技术网

Java JPA中的Call方法

Java JPA中的Call方法,java,jpa,methods,objectdb,Java,Jpa,Methods,Objectdb,我将ObjectDB与JPA一起使用。我想调用myMethod()。例如: entityManager.createQuery("SELECT ... FROM ... WHERE MyClass.myMethod() = 100") 可能吗?在类中的方法之前可能需要任何注释 @Entity public class MyClass implements Serializable { @Basic private int x; @Basic private

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

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

e、 g.创建一个函数,如下所示:

        public int myMethod(int x, int y){
           return x*1000+y;
        }
然后使用数据库的
方言
使用
registerFunction()
注册此函数。完成后,您可以按以下方式编写查询:

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

这有帮助。

不,你不能那样做。由于JPA总是使用prepared语句(参数化SQL),因此只能在JPQL查询的
WHERE
子句中设置参数,如

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

使方法(
myMethod()
)以某种方式返回该值,并用方法返回的值替换
setParameter()
方法的第二个参数,即
parameterValue
myMethod()

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

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

在JPA2.1中,您可以使用函数运算符调用“数据库”函数。有些数据库确实支持用Java定义函数,但通常使用专有数据库语言(如PL/SQL)

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


是的,您可以!并且不需要额外的注释

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();

在查询中尝试:
…MyClass data data.x*1000=100-data.y
。否。这只是一个示例方法。事实上,我还有其他更复杂的方法。但是如果我能够调用myMethod()所有问题都将得到解决。这显然是特定于Hibernate的,OP没有提到Hibernate。这个答案不正确,因为ObjectDB允许在查询字符串中使用类的方法。我们可以确认ObjectDB支持查询中的方法,作为标准JPQL.class(静态)的扩展支持方法和实例方法。请注意,在客户端-服务器模式下,服务器必须能够访问具有此类方法的类文件(即,在服务器类路径中)。