Вызов метода в 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;

Мотыга это помогает.

Другие вопросы по тегам