2014-04-04 5 views
5

При переходе через JPA QueryDSL все они включили концепцию безопасных типов запросов. Но что это такое? Согласно блогам/статьям, я предполагаю, что это функция JPA/QueryDSL, которая проверяет свой тип параметра при выполнении запросов. И что-то не так с запросом будет отображаться во время компиляции, а не во время выполнения. Я прав? Это только для этого или я чего-то здесь не вижу?Что конкретно означают безопасные запросы?

ответ

5

QueryDSL и Criteria являются библиотеками, которые пытаются обеспечить проверку типа данных при сборке запроса в JPA.

Просто потому, что JPQL - это просто запрос, который будет проверяться только во время выполнения, легко написать недопустимый запрос, который не обнаружен компилятором. Конечно, быстрее исправлять, пока вы кодируете, чем при запуске приложения.

Конечно, ни QueryDSL, ни критерии не могут защитить ваш запрос от всех видов ошибок (связанный тип данных или нет), но это безопаснее, чем JPQL.

С другой стороны, запись запросов в JPQL может быть намного проще и быстрее. Всегда компромисс :-)

+0

Ничего себе .. великое объяснение брата .. Вы выяснили мои смущения ... спасибо Лев .. –

4

API является безопасным по типу, если он использует систему типов языка программирования для предотвращения ошибок типа. В частности, QueryDSL позволяет компилятору проверить, что

  1. всех классы, используемых в запросе существуют (без опечаток ...) и постоянных (т.е. сопоставляется с базой данных)
  2. всех свойств, используемых в запросе существуют этот объект, и является стойкими
  3. результирующего запрос синтаксический действительный (не недостающих пунктов или ключевыми слов)
  4. всех операторов получают операнды приемлемого типа

Кроме того, выразительный запрос api позволяет вашей среде IDE обеспечивать завершение кода (также для классов домена и их свойств) и поддержку рефакторинга (если свойство переименовано, вы можете просто переименовать его в метамодель, а IDE будет переименовывать во всех запросах).

В качестве побочного преимущества очень сложно написать запрос, содержащий уязвимость SQL-инъекций.

Короче говоря, использование QueryDSL вместо JPQL (или запросов критики JPA в отсутствие статической метамодели) делает запись или изменение запросов более быстрыми и менее подверженными ошибкам.

Смежные вопросы