EJB 조회: BNF 구문
BNF(Backus-Naur Form)는 프로그래밍 언어나 명령어 세트의 구문을 지정하기 위해 가장 공통으로 사용된 표기법 중 하나입니다. 이 기사는 EJB(Enterprise JavaBeans) 조회 언어에 대한 구문을 나열합니다.
EJB QL ::= [select_clause] from_clause [where_clause] [order_by_clause]
DYNAMIC EJB QL := query_expression [order_by_clause]
query_expression := query_term [UNION [ALL] query_term]*
query_term := {select_clause_dynamic from_clause [where_clause]
[group_by_clause] [having_clause] } | (query_expression) } [order_by_clause]
from_clause::=FROM identification_variable_declaration
[, {identification_variable_declaration | collection_member_declaration } ]*
identification_variable_declaration::=collection_member_declaration |
range_variable_declaration [join]*
join := [ { LEFT [OUTER] | INNER }] JOIN {collection_valued_path_expression | single_valued_path_expression}
[AS] identifier
collection_member_declaration::=
IN ( collection_valued_path_expression ) [AS] identifier
range_variable_declaration::=abstract_schema_name [AS] identifier
single_valued_path_expression ::=
{single_valued_navigation | identification_variable}. ( cmp_field |
method | cmp_field.value_object_attribute | cmp_field.value_object_method )
| single_valued_navigation
single_valued_navigation::=
identification_variable.[ single_valued_cmr_field. ]*
single_valued_cmr_field
collection_valued_path_expression ::=
identification_variable.[ single_valued_cmr_field. ]*
collection_valued_cmr_field
select_clause::= SELECT { ALL | DISTINCT } {single_valued_path_expression |
identification_variable | OBJECT ( identification_variable) |
aggregate_functions }
select_clause_dynamic ::= SELECT { ALL | DISTINCT } [ selection , ]* selection
selection ::= { expression | subselect } [[AS] id ]
order_by_clause::= ORDER BY [ {single_valued_path_expression | integer} [ASC|DESC],]*
{single_valued_path_expression | integer}[ASC|DESC]
where_clause::= WHERE conditional_expression
conditional_expression ::= conditional_term |
conditional_expression OR conditional_term
conditional_term ::= conditional_factor |
conditional_term AND conditional_factor
conditional_factor ::= [NOT] conditional_primary
conditional_primary::=simple_cond_expression | (conditional_expression)
simple_cond_expression ::= comparison_expression | between_expression |
like_expression | in_expression | null_comparison_expression |
empty_collection_comparison_expression | quantified_expression |
exists_expression | is_of_type_expression | collection_member_expression
between_expression ::= expression [NOT] BETWEEN expression AND expression
in_expression ::= single_valued_path_expression [NOT] IN
{ (subselect) | ( [ atom ,]* atom ) }
atom = { string-literal | numeric-constant | input-parameter }
like_expression ::= expression [NOT] LIKE
{string_literal | input_parameter}
[ESCAPE {string_literal | input_parameter}]
null_comparison_expression ::=
single_valued_path_expression IS [ NOT ] NULL
empty_collection_comparison_expression ::=
collection_valued_path_expression IS [NOT] EMPTY
collection_member_expression ::=
{ single_valued_path_expression | input_paramter } [ NOT ] MEMBER [ OF ]
collection_valued_path_expression
quantified_expression ::=
expression comparison_operator {SOME | ANY | ALL} (subselect)
exists_expression ::= EXISTS {collection_valued_path_expression | (subselect)}
subselect ::= SELECT [{ ALL | DISTINCT }] expression from_clause [where_clause]
[group_by_clause] [having_clause]
group_by_clause::= GROUP BY [single_valued_path_expression,]*
single_valued_path_expression
having_clause ::= HAVING conditional_expression
is_of_type_expression ::= identifier IS OF TYPE
([[ONLY] abstract_schema_name,]* [ONLY] abstract_schema_name)
comparison_expression ::= expression comparison_operator { expression | ( subquery ) }
comparison_operator ::= = | > | >= | < | <= | <>
method ::= method_name( [[expression , ]* expression ] )
expression ::= term | expression {+|-} term
term ::= factor | term {*|/} factor
factor ::= {+|-} primary
primary ::= single_valued_path_expression | literal |
( expression ) | input_parameter | functions | aggregate_functions
aggregate_functions :=
AVG([ALL|DISTINCT] expression) |
COUNT({[ALL|DISTINCT] expression | * | identification_variable }) |
MAX([ALL|DISTINCT] expression) |
MIN([ALL|DISTINCT] expression) |
SUM([ALL|DISTINCT] expression) |
functions ::=
ABS(expression) |
BIGINT(expression) |
CHAR({expression [,{ISO|USA|EUR|JIS}] ) |
CONCAT (expression , expression ) |
DATE(expression) |
DAY({expression ) |
DAYS( expression) |
DECIMAL( expression [,integer[,integer]])
DIGITS( expression) |
DOUBLE( expression ) |
FLOAT( expression) |
HOUR ( expression ) |
INTEGER( expression ) |
LCASE ( expression) |
LENGTH(expression) |
LOCATE( expression, expression [, expression] ) |
MICROSECOND( expression ) |
MINUTE ( expression ) |
MOD ( expression , expression ) |
MONTH( expression ) |
REAL( expression) |
SECOND( expression ) |
SMALLINT( expression ) |
SQRT ( expression) |
SUBSTRING( expression, expression[, expression]) |
TIME( expression ) |
TIMESTAMP( expression ) |
UCASE ( expression) |
YEAR( expression )
xrel := XREL identification_variable . { single_valued_cmr_field | collection_valued_cmr_field }
[ , identification_variable . { single_valued_cmr_field | collection_valued_cmr_field } ]*
EJB 조회 제한사항 및 예외
CMP 상속 및 FROM 절 결합 사용을 포함한 EJB-QL
제한사항
EJB-QL 구문 분석기는 다음 누적 기준과 일치하는 조회로 부적절하게 SQL이 생성되었음을 발견했습니다.
- EJB-QL 조회는 FROM 절에 결합을 포함합니다(예를 들어, FROM Entity a, IN (a.b.c.d) dGroup).
- EJB-QL 조회는 FROM 절 결합과도 연관된 내부 경로 요소에서 이동하는 술어를 포함합니다(예를 들어, WHERE a.b.g.id = :?1).
- FROM 결합에서 하나 이상의 비리프 경로 엔티티는 엔티티 유형 상속을 이용합니다(예를 들어, b extends b_super).
- 술어에서 공통 경로 요소로 주소 지정된 엔티티는 엔티티 유형 상속도 이용합니다(예를 들어, g extends g_super).