JPA JPQl или хранимые процедуры в MySQL - PullRequest
1 голос
/ 22 марта 2012

Я занимаюсь разработкой приложения, которое использует JPA 2.0 с базой данных MySQL 5.

Я знаю, что JPA скрывает вызовы запросов к БД и делает их недооцененными, и все, что я использую, это JPQL,

теперь это делает потребность в хранимых процедурах меньше?и как я могу использовать хранимые процедуры с JPA 2.0?

Ответы [ 2 ]

3 голосов
/ 22 октября 2012

Хранимые процедуры в основном потеряли популярность (вы можете прочитать некоторые идеи о том, почему здесь: http://www.codinghorror.com/blog/2004/10/who-needs-stored-procedures-anyways.html).

В целом, если у вас нет проблем с производительностью или вы работаете с устаревшими системами, рекомендуется не использовать хранимые процедуры. Решения объектно-реляционного сопоставления, такие как JPA, в настоящее время являются отраслевым стандартом, главным образом потому, что они позволяют писать меньше и проще в обслуживании, чем другие методы (например, использование шаблона DAO и JDBC напрямую).

Например, рассмотрите возможность добавления нового столбца в таблицу, которую вы используете CRUD (Создать, получить, обновить, удалить) с помощью:

  • Используя JPA, вы добавляете столбец в таблицу и добавляете свойство в класс с аннотацией, вот и все.
  • В случае хранимых процедур вам также необходимо добавить параметр в процедуры для обновления или создания новой сущности, вам нужно будет добавить столбец в оператор вставки или обновления внутри процедуры, в некоторых случаях вы ' Вам нужно будет добавить столбец к предложению select внутри процедуры.

Что касается использования хранимых процедур, JPA не поддерживает хранимые процедуры как таковые, но есть два способа обойти это:

  • Некоторые реализации JPA (такие как EclipseLink или Hibernate) поддерживают хранимые процедуры, и вы можете напрямую использовать их реализацию, вам нужно будет увидеть, какую реализацию вы используете.
  • Вы можете использовать функцию «нативный запрос», которая позволяет писать SQL на языке запросов к собственной базе данных, например, для MySQL вы можете написать что-то вроде этого:

    Query query = entityManager.createNativeQuery("{ CALL procedure(?) }");  
    query.setParameter(1, parameterName);
    

    Вам также нужно помнить, что процедура должна возвращать набор результатов, и вы не можете использовать параметры.

1 голос
/ 22 октября 2012

если вы используете EclipseLink JPA, вы можете использовать @NamedStoredProcedureQuery аннотацию для хранимых процедур.

Пример:

@NamedStoredProcedureQuery(
    name="findAllEmployees", 
    procedureName="EMP_READ_ALL", 
    resultClass=Employee.class, 
    parameters = {
        @StoredProcedureParameter(
            queryParameter="result", 
            name="RESULT_CURSOR",
            direction=Direction.OUT_CURSOR
        )
    }
)
@Entity
public class Employee {
  ...
}

Вы можете ссылаться здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...