Вызов метода в JPA
Я использую 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 ответа
JPQL не совсем объектно-ориентированный язык запросов. Вы не можете определить свои собственные методы, а JPQL предоставляет очень ограниченный набор функций. Так что, если вы хотите придерживаться спецификации JPA, ответ - нет; должен был бы быть специфичным для реализации JPA- DataNucleus JPA, безусловно, позволяет вам иметь свои собственные методы на языке запросов (в качестве расширения поставщика), не имея представления о вашем цитируемом провайдере JPA- хотя, тем не менее, он будет выполнять только такой запрос в хранилище данных, если вы поместите код для этого метода в реализацию метода запроса (в отличие от класса)
Да, ты можешь! И никаких дополнительных аннотаций не требуется.
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();
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
Нет, ты не можешь этого сделать. Поскольку JPA всегда работает с подготовленным оператором (параметризованным SQL), вы можете установить параметры только в WHERE
предложение запроса JPQL, как
entityManager.createQuery("SELECT .... FROM ... WHERE
someCondition=:someValue).setParameter("someValue", "parameterValue");
Сделай метод (myMethod()
) вернуть это значение как-то и заменить второй параметр, который parameterValue
из setParameter()
метод по значению, возвращенному вашим методом, myMethod()
,
Не так, как вы ищете. Если вы хотите использовать пользовательский метод, вы можете создать и зарегистрировать их, прежде чем использовать их.
например, создайте функцию, как показано ниже:
public int myMethod(int x, int y){
return x*1000+y;
}
Затем зарегистрируйте эту функцию, используя registerFunction()
с dialect
вашей базы данных. После этого вы можете написать запрос как:
from MyClass data where myMethod(data.x, data.y) =100;
Мотыга это помогает.