= SQL AST Ultimately our goal here is to have a `JdbcOperation` object to be executed. Generally, that would look like this: [source] ---- final SelectStatement sqlAst = ...; final JdbcServices jdbcServices = sessionFactory.getJdbcServices(); final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory(); final JdbcSelect jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator( sessionFactory ).translate( sqlAst ); final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() ); // <fill in parameter bindings> session.getFactory().getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, ... ); ---- == The Tree The actual tree nodes are defined in the `org.hibernate.sql.ast.tree` package. == Building SQL AST There are 3 main producers of SQL AST: SQM:: Translation of HQL and criteria queries. See `org.hibernate.query.sqm.sql` Loading:: SQL generated for persistence-context events to load entities and collections. This includes `Session#find`, `Session#get`, `Session#lock`, ... See `org.hibernate.loader.internal.MetamodelSelectBuilderProcess` Mutations:: SQL generated for persistence-context flush events to write entity and collection state to the database. See `org.hibernate.persister.entity.mutation` and `org.hibernate.persister.collection.mutation` == Translating SQL AST Translating a SQL AST produces 2 pieces of information needed for executing SQL: * `org.hibernate.sql.exec.spi.JdbcOperation` * `org.hibernate.sql.exec.spi.JdbcParameterBindings` === JdbcOperation * `org.hibernate.sql.exec.spi.JdbcDelete` * `org.hibernate.sql.exec.spi.JdbcInsert` * `org.hibernate.sql.exec.spi.JdbcSelect` * `org.hibernate.sql.exec.spi.JdbcUpdate` === JdbcParameterBindings == Execution === SELECT execution `org.hibernate.sql.exec.spi.JdbcSelectExecutor` === INSERT, UPDATE, DELETE execution `org.hibernate.sql.exec.spi.JdbcMutationExecutor`