Java JPA中的Call方法
我将ObjectDB与JPA一起使用。我想调用myMethod()。例如: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
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(静态)的扩展支持方法和实例方法。请注意,在客户端-服务器模式下,服务器必须能够访问具有此类方法的类文件(即,在服务器类路径中)。