-
Notifications
You must be signed in to change notification settings - Fork 0
executedSqlViaConsole
mybloom edited this page May 17, 2022
·
1 revision
콘솔에서 확인할 수 있는 쿼리
- HQL AST : [QUERY] Node: 'query'
- Tables referenced from query nodes(쿼리노드로 참조된 테이블) : QueryNode
- SQL AST (Abstract Syntax Trees)
- HQL
- SQL
메서드 코드
public List<Sidedish> findAllBySubCategoryId(Long categoryId) {
String jpql = "select s "
+ "from Sidedish s "
+ "join fetch s.sidedishCategories sc "
+ "where sc.categoryId = :categoryId";
return entityManager.createQuery(jpql, Sidedish.class)
.setParameter("categoryId" , categoryId)
.getResultList();
}
1 HQL AST
\-[QUERY] Node: 'query'
+-[SELECT_FROM] Node: 'SELECT_FROM'
| +-[FROM] Node: 'from'
| | +-[RANGE] Node: 'RANGE'
| | | +-[DOT] Node: '.'
| | | | +-[DOT] Node: '.'
| | | | | +-[DOT] Node: '.'
| | | | | | +-[DOT] Node: '.'
| | | | | | | +-[IDENT] Node: 'com'
| | | | | | | \-[IDENT] Node: 'project'
| | | | | | \-[IDENT] Node: 'sidedish_jpa'
| | | | | \-[IDENT] Node: 'sidedish'
| | | | \-[IDENT] Node: 'Sidedish'
| | | \-[ALIAS] Node: 's'
| | \-[JOIN] Node: 'join'
| | +-[FETCH] Node: 'fetch'
| | +-[DOT] Node: '.'
| | | +-[IDENT] Node: 's'
| | | \-[IDENT] Node: 'sidedishCategories'
| | \-[ALIAS] Node: 'sc'
| \-[SELECT] Node: 'select'
| \-[IDENT] Node: 's'
\-[WHERE] Node: 'where'
\-[EQ] Node: '='
+-[DOT] Node: '.'
| +-[IDENT] Node: 'sc'
| \-[IDENT] Node: 'categoryId'
\-[COLON] Node: ':'
\-[IDENT] Node: 'categoryId'
- join tree
12:22:54.661 [DEBUG] [Test worker] [o.h.hql.internal.ast.HqlSqlWalker] - createFromJoinElement() : -- join tree --
\-[JOIN_FRAGMENT] FromElement: 'sidedish_category sidedishca1_' FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=sc,role=com.project.sidedish_jpa.sidedish.Sidedish.sidedishCategories,tableName=sidedish_category,tableAlias=sidedishca1_,origin=sidedish sidedish0_,columns={sidedish0_.sidedish_id,className=com.project.sidedish_jpa.sidedish.SidedishCategory}}
- processQuery() :
SELECT ( {select clause} sidedish0_.sidedish_id )
( fromclause{level=1} (sidedish sidedish0_ sidedish_category sidedishca1_ ) )
( WHERE ( = ( sidedishca1_.category_id sidedishca1_.sidedish_category_id categoryid ) ? ) )
- Tables referenced from query nodes :
\-QueryNode
+-SelectClause
| referencedTables(entity Sidedish): [sidedish]
| referencedTables(entity SidedishCategory): [sidedish_category]
| +-IdentNode
| | persister: SingleTableEntityPersister(com.project.sidedish_jpa.sidedish.Sidedish)
| | originalText: s
| +-SelectExpressionImpl
| | persister: SingleTableEntityPersister(com.project.sidedish_jpa.sidedish.SidedishCategory)
| +-SqlFragment
| +-SqlFragment
| \-SqlFragment
+-FromClause
| \-FromElement
| \-FromElement
\-SqlNode
\-BinaryLogicOperatorNode
+-DotNode
| persister: SingleTableEntityPersister(com.project.sidedish_jpa.sidedish.SidedishCategory)
| path: sc.categoryId
| +-IdentNode
| | persister: SingleTableEntityPersister(com.project.sidedish_jpa.sidedish.SidedishCategory)
| | originalText: sc
| \-IdentNode
| persister: null
| originalText: categoryId
\-ParameterNode
SQL AST
- 여기에서는
not a fetch join 으로 확인
- 확인 : 짐작해 보건데 실제 작동 쿼리이기 때문일 것 같다.
\-[SELECT] QueryNode: 'SELECT' querySpaces (sidedish_category,sidedish)
+-[SELECT_CLAUSE] SelectClause: '{select clause}'
| +-[ALIAS_REF] IdentNode: 'sidedish0_.sidedish_id as sidedish1_1_0_' {alias=s, className=com.project.sidedish_jpa.sidedish.Sidedish, tableAlias=sidedish0_}
| +-[SELECT_EXPR] SelectExpressionImpl: 'sidedishca1_.sidedish_category_id as sidedish1_2_1_' {FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=sc,role=com.project.sidedish_jpa.sidedish.Sidedish.sidedishCategories,tableName=sidedish_category,tableAlias=sidedishca1_,origin=sidedish sidedish0_,columns={sidedish0_.sidedish_id,className=com.project.sidedish_jpa.sidedish.SidedishCategory}}}
| +-[SQL_TOKEN] SqlFragment: 'sidedish0_.category_id as category2_1_0_, sidedish0_.description as descript3_1_0_, sidedish0_.name as name4_1_0_, sidedish0_.price as price5_1_0_, sidedish0_.stock_quantity as stock_qu6_1_0_'
| +-[SQL_TOKEN] SqlFragment: 'sidedishca1_.created_by as created_2_2_1_, sidedishca1_.created_date as created_3_2_1_, sidedishca1_.modified_by as modified4_2_1_, sidedishca1_.modified_date as modified5_2_1_, sidedishca1_.category_id as category6_2_1_, sidedishca1_.sidedish_id as sidedish7_2_1_'
| \-[SQL_TOKEN] SqlFragment: 'sidedishca1_.sidedish_id as sidedish7_2_0__, sidedishca1_.sidedish_category_id as sidedish1_2_0__'
+-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=2, fromElements=2, fromElementByClassAlias=[sc, s], fromElementByTableAlias=[sidedish0_, sidedishca1_], fromElementsByPath=[s.sidedishCategories], collectionJoinFromElementsByPath=[], impliedElements=[]}
| \-[FROM_FRAGMENT] FromElement: 'sidedish sidedish0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=s,role=null,tableName=sidedish,tableAlias=sidedish0_,origin=null,columns={,className=com.project.sidedish_jpa.sidedish.Sidedish}}
| \-[JOIN_FRAGMENT] FromElement: 'inner join sidedish_category sidedishca1_ on sidedish0_.sidedish_id=sidedishca1_.sidedish_id' FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=sc,role=com.project.sidedish_jpa.sidedish.Sidedish.sidedishCategories,tableName=sidedish_category,tableAlias=sidedishca1_,origin=sidedish sidedish0_,columns={sidedish0_.sidedish_id,className=com.project.sidedish_jpa.sidedish.SidedishCategory}}
\-[WHERE] SqlNode: 'where'
Ident \-[EQ] BinaryLogicOperatorNode: '='
+-[DOT] DotNode: 'sidedishca1_.category_id' {propertyName=categoryId,dereferenceType=PRIMITIVE,getPropertyPath=categoryId,path=sc.categoryId,tableAlias=sidedishca1_,className=com.project.sidedish_jpa.sidedish.SidedishCategory,classAlias=sc}
| +-[ALIAS_REF] IdentNode: 'sidedishca1_.sidedish_category_id' {alias=sc, className=com.project.sidedish_jpa.sidedish.SidedishCategory, tableAlias=sidedishca1_}
| \-[IDENT] IdentNode: 'categoryId' {originalText=categoryId}
\-[NAMED_PARAM] ParameterNode: '?' {name=categoryId, expectedType=org.hibernate.type.LongType@401317a0}
SQL
SELECT s
FROM com.project.sidedish_jpa.sidedish.sidedish s
JOIN FETCH s.sidedishcategories sc
WHERE sc.categoryid = :categoryId
HSQL
SELECT sidedish0_.sidedish_id AS sidedish1_1_0_,
sidedishca1_.sidedish_category_id AS sidedish1_2_1_,
sidedish0_.category_id AS category2_1_0_,
sidedish0_.description AS descript3_1_0_,
sidedish0_.NAME AS name4_1_0_,
sidedish0_.price AS price5_1_0_,
sidedish0_.stock_quantity AS stock_qu6_1_0_,
sidedishca1_.created_by AS created_2_2_1_,
sidedishca1_.created_date AS created_3_2_1_,
sidedishca1_.modified_by AS modified4_2_1_,
sidedishca1_.modified_date AS modified5_2_1_,
sidedishca1_.category_id AS category6_2_1_,
sidedishca1_.sidedish_id AS sidedish7_2_1_,
sidedishca1_.sidedish_id AS sidedish7_2_0__,
sidedishca1_.sidedish_category_id AS sidedish1_2_0__
FROM sidedish sidedish0_
INNER JOIN sidedish_category sidedishca1_
ON sidedish0_.sidedish_id = sidedishca1_.sidedish_id
WHERE sidedishca1_.category_id = ?
HQL AST
-
not a fetch join
확인 -
join tree
11:50:59.124 [DEBUG] [Test worker] [o.h.hql.internal.ast.HqlSqlWalker] - createFromJoinElement() : -- join tree --
\-[JOIN_FRAGMENT] FromElement: 'sidedish_category sidedishca1_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=sc,role=com.project.sidedish_jpa.sidedish.Sidedish.sidedishCategories,tableName=sidedish_category,tableAlias=sidedishca1_,origin=sidedish sidedish0_,columns={sidedish0_.sidedish_id,className=com.project.sidedish_jpa.sidedish.SidedishCategory}}
SQL AST
11:50:59.150 [DEBUG] [Test worker] [o.h.h.i.ast.QueryTranslatorImpl] - --- SQL AST ---
\-[SELECT] QueryNode: 'SELECT' querySpaces (sidedish_category,sidedish)
+-[SELECT_CLAUSE] SelectClause: '{select clause}'
| +-[ALIAS_REF] IdentNode: 'sidedish0_.sidedish_id as sidedish1_1_' {alias=s, className=com.project.sidedish_jpa.sidedish.Sidedish, tableAlias=sidedish0_}
| \-[SQL_TOKEN] SqlFragment: 'sidedish0_.category_id as category2_1_, sidedish0_.description as descript3_1_, sidedish0_.name as name4_1_, sidedish0_.price as price5_1_, sidedish0_.stock_quantity as stock_qu6_1_'
+-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=2, fromElements=2, fromElementByClassAlias=[sc, s], fromElementByTableAlias=[sidedish0_, sidedishca1_], fromElementsByPath=[s.sidedishCategories], collectionJoinFromElementsByPath=[], impliedElements=[]}
| \-[FROM_FRAGMENT] FromElement: 'sidedish sidedish0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=s,role=null,tableName=sidedish,tableAlias=sidedish0_,origin=null,columns={,className=com.project.sidedish_jpa.sidedish.Sidedish}}
| \-[JOIN_FRAGMENT] FromElement: 'inner join sidedish_category sidedishca1_ on sidedish0_.sidedish_id=sidedishca1_.sidedish_id' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=sc,role=com.project.sidedish_jpa.sidedish.Sidedish.sidedishCategories,tableName=sidedish_category,tableAlias=sidedishca1_,origin=sidedish sidedish0_,columns={sidedish0_.sidedish_id,className=com.project.sidedish_jpa.sidedish.SidedishCategory}}
\-[WHERE] SqlNode: 'where'
\-[EQ] BinaryLogicOperatorNode: '='
+-[DOT] DotNode: 'sidedishca1_.category_id' {propertyName=categoryId,dereferenceType=PRIMITIVE,getPropertyPath=categoryId,path=sc.categoryId,tableAlias=sidedishca1_,className=com.project.sidedish_jpa.sidedish.SidedishCategory,classAlias=sc}
| +-[ALIAS_REF] IdentNode: 'sidedishca1_.sidedish_category_id' {alias=sc, className=com.project.sidedish_jpa.sidedish.SidedishCategory, tableAlias=sidedishca1_}
| \-[IDENT] IdentNode: 'categoryId' {originalText=categoryId}
\-[NAMED_PARAM] ParameterNode: '?' {name=categoryId, expectedType=org.hibernate.type.LongType@401317a0}
HQL
SELECT s
FROM com.project.sidedish_jpa.sidedish.sidedish s
JOIN s.sidedishcategories sc
where sc.categoryid = :categoryId
SQL
SELECT sidedish0_.sidedish_id AS sidedish1_1_,
sidedish0_.category_id AS category2_1_,
sidedish0_.description AS descript3_1_,
sidedish0_.NAME AS name4_1_,
sidedish0_.price AS price5_1_,
sidedish0_.stock_quantity AS stock_qu6_1_
FROM sidedish sidedish0_
INNER JOIN sidedish_category sidedishca1_
ON sidedish0_.sidedish_id = sidedishca1_.sidedish_id
WHERE sidedishca1_.category_id = ?
연관관계 컬렉션 로딩 시 발생 쿼리 : Loading collection: [com.project.sidedish_jpa.sidedish.Sidedish.sidedishCategories#1]
- [org.hibernate.SQL]
select
sidedishca0_.sidedish_id as sidedish7_2_0_,
sidedishca0_.sidedish_category_id as sidedish1_2_0_,
sidedishca0_.sidedish_category_id as sidedish1_2_1_,
sidedishca0_.created_by as created_2_2_1_,
sidedishca0_.created_date as created_3_2_1_,
sidedishca0_.modified_by as modified4_2_1_,
sidedishca0_.modified_date as modified5_2_1_,
sidedishca0_.category_id as category6_2_1_,
sidedishca0_.sidedish_id as sidedish7_2_1_
from
sidedish_category sidedishca0_
where
sidedishca0_.sidedish_id=?
- AST : Abstract Syntax Trees
- Query Node
- AST 에서 나오는 단어들
- SingleTableEntityPersister 등
궁금한 키워드에 대해 찾아본 사이트
- SQL Abstract Syntax Trees Vocabulary : http://ns.inria.fr/ast/sql/index.html