Class AbstractSqlLikeQueryBuilder2
java.lang.Object
io.micronaut.data.model.query.builder.sql.AbstractSqlLikeQueryBuilder2
- All Implemented Interfaces:
QueryBuilder2
- Direct Known Subclasses:
JpaQueryBuilder2
,SqlQueryBuilder2
@Internal
public abstract class AbstractSqlLikeQueryBuilder2
extends Object
implements QueryBuilder2
An abstract class for builders that build SQL-like queries.
- Since:
- 1.0.0
- Author:
- graemerocher, Denis Stepanov
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic final record
Represents a placeholder in query.protected static enum
protected class
Represents a path to a property.protected final class
The state of the query.protected class
The predicate visitor to construct the query.protected class
The selection visitor to construct the query.Nested classes/interfaces inherited from interface io.micronaut.data.model.query.builder.QueryBuilder2
QueryBuilder2.BaseQueryDefinition, QueryBuilder2.DeleteQueryDefinition, QueryBuilder2.InsertQueryDefinition, QueryBuilder2.SelectQueryDefinition, QueryBuilder2.UpdateQueryDefinition
-
Field Summary
Modifier and TypeFieldDescriptionprotected static final String
protected static final String
protected static final String
protected static final String
protected static final char
protected static final char
protected static final String
protected static final char
protected static final String
protected static final String
protected static final String
protected static final String
protected static final char
protected static final String
static final String
protected static final String
protected static final String
protected static final char
protected static final String
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected @NonNull StringBuilder
appendDeleteClause
(StringBuilder queryString) Append the delete clause.protected final void
appendExpression
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, StringBuilder query, AbstractSqlLikeQueryBuilder2.QueryState queryState, jakarta.persistence.criteria.Expression<?> expression, boolean isProjection) protected void
appendForUpdate
(AbstractSqlLikeQueryBuilder2.QueryPosition queryPosition, QueryBuilder2.SelectQueryDefinition definition, StringBuilder queryBuilder) Adds "forUpdate" pessimistic locking.protected void
appendOrder
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, QueryBuilder2.SelectQueryDefinition definition, AbstractSqlLikeQueryBuilder2.QueryState queryState) Appends order to the query.protected final void
appendPropertyRef
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, StringBuilder query, AbstractSqlLikeQueryBuilder2.QueryState queryState, PersistentPropertyPath pp, boolean isProjection) protected void
appendTransformed
(StringBuilder sb, String transformed, Runnable appendParameter) Appends custom query part.protected void
appendUpdateSetParameter
(StringBuilder sb, String alias, PersistentProperty prop, Runnable appendParameter) Appends the SET=? call to the query string.protected @NonNull String
Convert the literal value to it's SQL representation.protected static String
asPath
(List<Association> associations, PersistentProperty property) Join associations and property as path.protected final AbstractSqlLikeQueryBuilder2.QueryPropertyPath
asQueryPropertyPath
(String tableAlias, PersistentProperty persistentProperty) protected String
buildAdditionalWhereClause
(AbstractSqlLikeQueryBuilder2.QueryState queryState, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Builds additional where clause if there isWhere
annotation on the entity.protected final String
buildAdditionalWhereString
(JoinPath joinPath, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Builds WHERE clause based onWhere
annotation on the metadata.protected String
buildAdditionalWhereString
(String alias, PersistentEntity entity, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Builds WHERE clause for the entity and given alias ifIgnoreWhere
is not present.buildDelete
(@NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull QueryBuilder2.DeleteQueryDefinition definition) Encode the given query into the encoded query instance.protected void
buildJoin
(String joinType, StringBuilder query, AbstractSqlLikeQueryBuilder2.QueryState queryState, PersistentAssociationPath joinAssociation, PersistentEntity associationOwner, String currentJoinAlias, String lastJoinAlias) Build a join expression for the given alias, association, join type and builder.@NonNull QueryResult
buildOrderBy
(String query, @NonNull PersistentEntity entity, @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull Sort sort, boolean nativeQuery) Encode the given query into the encoded query instance.buildPropertyByName
(@NonNull String propertyName, @NonNull String query, @NonNull PersistentEntity entity, @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, boolean nativeQuery) Encode the given property retrieval into a query instance.buildSelect
(@NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull QueryBuilder2.SelectQueryDefinition definition) Encode the given query for the passed annotation metadata and query.protected void
buildSelect
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, AbstractSqlLikeQueryBuilder2.QueryState queryState, jakarta.persistence.criteria.Selection<?> selection, boolean distinct) Build select statement.buildUpdate
(@NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull QueryBuilder2.UpdateQueryDefinition definition) Encode the given query into the encoded query instance.protected void
buildWhereClause
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, jakarta.persistence.criteria.Predicate predicate, AbstractSqlLikeQueryBuilder2.QueryState queryState) Builds where clause.protected void
If and whenEntityRepresentation
annotation with JSON type is used for the repository method but dialect does not support JSON entity representations this will throwIllegalArgumentException
.protected abstract boolean
Whether property path expressions require computation by the implementation.createPredicateVisitor
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, AbstractSqlLikeQueryBuilder2.QueryState queryState) Create a predicate visitor.createSelectionVisitor
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, AbstractSqlLikeQueryBuilder2.QueryState queryState, boolean distinct) Create a selection visitor.protected abstract AbstractSqlLikeQueryBuilder2.Placeholder
formatParameter
(int index) Format the parameter at the given index.protected String
getAliasName
(PersistentEntity entity) Get an alias name for the given entity.getAliasName
(JoinPath joinPath) Get the alias name.protected final String
getColumnAlias
(PersistentProperty property) Gets column alias if defined as alias field on MappedProperty annotation on the mapping field.protected abstract String
getColumnName
(PersistentProperty persistentProperty) Get the column name for the given property.getDataTransformerReadValue
(String alias, PersistentProperty prop) Returns transformed value if the data transformer id defined.getDataTransformerWriteValue
(String alias, PersistentProperty prop) Returns transformed value if the data transformer id defined.protected Dialect
Get dialect.protected @NonNull String
getMappedName
(@NonNull NamingStrategy namingStrategy, @NonNull Association association) Gets the mapped name from the association usingNamingStrategy
.protected @NonNull String
getMappedName
(@NonNull NamingStrategy namingStrategy, @NonNull PersistentPropertyPath propertyPath) Gets the mapped name from for the list of associations and property usingNamingStrategy
.protected @NonNull String
getMappedName
(@NonNull NamingStrategy namingStrategy, @NonNull List<Association> associations, @NonNull PersistentProperty property) Gets the mapped name from for the list of associations and property usingNamingStrategy
.protected NamingStrategy
getNamingStrategy
(PersistentEntity entity) GetsNamingStrategy
for the entity.protected NamingStrategy
getNamingStrategy
(PersistentPropertyPath propertyPath) GetsNamingStrategy
for the property path.protected @NonNull String
getPathOnlyAliasName
(JoinPath joinPath) Get the alias name for just the join path.protected String
Get the AS keyword to use for table aliases.protected abstract String
getTableName
(PersistentEntity entity) Get the table name for the given entity.protected String
Get the table name for the given entity.protected abstract boolean
isAliasForBatch
(PersistentEntity persistentEntity, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Should aliases be used in batch statements.protected boolean
isJsonEntity
(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, PersistentEntity entity) Checks whetherEntityRepresentation
annotation with JSON type is used for the repository method.protected BindingParameter.BindingContext
newBindingContext
(@Nullable PersistentPropertyPath ref) Creates new binding parameter context.protected String
Quote a column name for the dialect.abstract String
Resolves the join type.protected final String
resolveWhereForAnnotationMetadata
(String alias, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Resolves where clause if there isWhere
annotation on the entity.protected boolean
shouldEscape
(@NonNull PersistentEntity entity) Whether queries should be escaped for the given entity.protected boolean
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface io.micronaut.data.model.query.builder.QueryBuilder2
buildInsert, buildPagination
-
Field Details
-
ORDER_BY_CLAUSE
- See Also:
-
SELECT_CLAUSE
- See Also:
-
AS_CLAUSE
- See Also:
-
FROM_CLAUSE
- See Also:
-
WHERE_CLAUSE
- See Also:
-
COMMA
protected static final char COMMA- See Also:
-
CLOSE_BRACKET
protected static final char CLOSE_BRACKET- See Also:
-
OPEN_BRACKET
protected static final char OPEN_BRACKET- See Also:
-
SPACE
protected static final char SPACE- See Also:
-
DOT
protected static final char DOT- See Also:
-
NOT
- See Also:
-
AND
- See Also:
-
LOGICAL_AND
- See Also:
-
RETURNING
- See Also:
-
OR
- See Also:
-
LOGICAL_OR
- See Also:
-
DISTINCT
- See Also:
-
ALIAS_REPLACE_QUOTED
- See Also:
-
CANNOT_QUERY_ON_ID_WITH_ENTITY_THAT_HAS_NO_ID
- See Also:
-
-
Constructor Details
-
AbstractSqlLikeQueryBuilder2
public AbstractSqlLikeQueryBuilder2()
-
-
Method Details
-
getDialect
Get dialect.- Returns:
- dialect
-
traverseEmbedded
protected boolean traverseEmbedded()- Returns:
- True if embedded properties should be traversed
-
asLiteral
Convert the literal value to it's SQL representation.- Parameters:
value
- The literal value- Returns:
- converter value
-
asQueryPropertyPath
protected final AbstractSqlLikeQueryBuilder2.QueryPropertyPath asQueryPropertyPath(String tableAlias, PersistentProperty persistentProperty) -
buildSelect
public QueryResult buildSelect(@NonNull @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull @NonNull QueryBuilder2.SelectQueryDefinition definition) Description copied from interface:QueryBuilder2
Encode the given query for the passed annotation metadata and query.- Specified by:
buildSelect
in interfaceQueryBuilder2
- Parameters:
annotationMetadata
- The annotation metadatadefinition
- The query model- Returns:
- The query result
-
getTableName
Get the table name for the given entity.- Parameters:
entity
- The entity- Returns:
- The table name
-
getUnescapedTableName
Get the table name for the given entity.- Parameters:
entity
- The entity- Returns:
- The table name
-
getAliasName
Get an alias name for the given entity.- Parameters:
entity
- The entity- Returns:
- The alias name
-
getAliasName
Get the alias name.- Parameters:
joinPath
- The join path- Returns:
- The alias
-
getPathOnlyAliasName
Get the alias name for just the join path.- Parameters:
joinPath
- The join path- Returns:
- The alias
-
buildJoin
protected void buildJoin(String joinType, StringBuilder query, AbstractSqlLikeQueryBuilder2.QueryState queryState, PersistentAssociationPath joinAssociation, PersistentEntity associationOwner, String currentJoinAlias, String lastJoinAlias) Build a join expression for the given alias, association, join type and builder.- Parameters:
joinType
- The join typequery
- The query builderqueryState
- The statejoinAssociation
- The associationassociationOwner
- The associated ownercurrentJoinAlias
- The current join aliaslastJoinAlias
- The last join alias
-
getColumnName
Get the column name for the given property.- Parameters:
persistentProperty
- The property- Returns:
- The column name
-
shouldEscape
Whether queries should be escaped for the given entity.- Parameters:
entity
- The entity- Returns:
- True if they should be escaped
-
getTableAsKeyword
Get the AS keyword to use for table aliases.- Returns:
- The AS keyword if any
-
quote
Quote a column name for the dialect.- Parameters:
persistedName
- The persisted name.- Returns:
- The quoted name
-
buildSelect
protected void buildSelect(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, AbstractSqlLikeQueryBuilder2.QueryState queryState, jakarta.persistence.criteria.Selection<?> selection, boolean distinct) Build select statement.- Parameters:
annotationMetadata
- the annotation metadataqueryState
- the query stateselection
- projection list (can be empty, then selects all columns)distinct
- is distinct selection
-
createSelectionVisitor
protected AbstractSqlLikeQueryBuilder2.SqlSelectionVisitor createSelectionVisitor(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, AbstractSqlLikeQueryBuilder2.QueryState queryState, boolean distinct) Create a selection visitor.- Parameters:
annotationMetadata
- The annotation metadataqueryState
- The query statedistinct
- The distinct- Returns:
- The visitor
-
getNamingStrategy
GetsNamingStrategy
for the property path. Subclasses might override and potentially provide different strategy in some cases.- Parameters:
propertyPath
- the property path representation- Returns:
- naming strategy for the property path
-
getNamingStrategy
GetsNamingStrategy
for the entity. Subclasses might override and potentially provide different strategy in some cases.- Parameters:
entity
- the persistent entity- Returns:
- naming strategy for the entity
-
getMappedName
@NonNull protected @NonNull String getMappedName(@NonNull @NonNull NamingStrategy namingStrategy, @NonNull @NonNull Association association) Gets the mapped name from the association usingNamingStrategy
.- Parameters:
namingStrategy
- the naming strategy being usedassociation
- the association- Returns:
- the mapped name for the association
-
getMappedName
@NonNull protected @NonNull String getMappedName(@NonNull @NonNull NamingStrategy namingStrategy, @NonNull @NonNull List<Association> associations, @NonNull @NonNull PersistentProperty property) Gets the mapped name from for the list of associations and property usingNamingStrategy
.- Parameters:
namingStrategy
- the naming strategyassociations
- the association listproperty
- the property- Returns:
- the mappen name for the list of associations and property using given naming strategy
-
getMappedName
@NonNull protected @NonNull String getMappedName(@NonNull @NonNull NamingStrategy namingStrategy, @NonNull @NonNull PersistentPropertyPath propertyPath) Gets the mapped name from for the list of associations and property usingNamingStrategy
.- Parameters:
namingStrategy
- the naming strategypropertyPath
- the property path- Returns:
- the mappen name for the list of associations and property using given naming strategy
-
buildWhereClause
protected void buildWhereClause(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, jakarta.persistence.criteria.Predicate predicate, AbstractSqlLikeQueryBuilder2.QueryState queryState) Builds where clause.- Parameters:
annotationMetadata
- the annotation metadata for the methodpredicate
- the predicatequeryState
- the query state
-
createPredicateVisitor
protected AbstractSqlLikeQueryBuilder2.SqlPredicateVisitor createPredicateVisitor(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, AbstractSqlLikeQueryBuilder2.QueryState queryState) Create a predicate visitor.- Parameters:
annotationMetadata
- The annotation metadataqueryState
- The query state- Returns:
- The visitor
-
buildAdditionalWhereClause
protected String buildAdditionalWhereClause(AbstractSqlLikeQueryBuilder2.QueryState queryState, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Builds additional where clause if there isWhere
annotation on the entity.- Parameters:
queryState
- the query stateannotationMetadata
- the annotation metadata- Returns:
- where clause if there was
Where
annotation on the entity (or joins for JPA implementation)
-
buildAdditionalWhereString
protected String buildAdditionalWhereString(String alias, PersistentEntity entity, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Builds WHERE clause for the entity and given alias ifIgnoreWhere
is not present.- Parameters:
alias
- the entity aliasentity
- the entityannotationMetadata
- the entity metadata- Returns:
- the WHERE clause
-
buildAdditionalWhereString
protected final String buildAdditionalWhereString(JoinPath joinPath, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Builds WHERE clause based onWhere
annotation on the metadata.- Parameters:
joinPath
- the join pathannotationMetadata
- the annotation metadata- Returns:
- WHERE clause if
Where
annotation is declared andIgnoreWhere
is not present, otherwise empty string
-
resolveWhereForAnnotationMetadata
protected final String resolveWhereForAnnotationMetadata(String alias, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Resolves where clause if there isWhere
annotation on the entity.- Parameters:
alias
- the entity aliasannotationMetadata
- the entity annotation metadata- Returns:
- where clause with entity alias if entity has declared where annotation
-
appendOrder
protected void appendOrder(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, QueryBuilder2.SelectQueryDefinition definition, AbstractSqlLikeQueryBuilder2.QueryState queryState) Appends order to the query.- Parameters:
annotationMetadata
- the annotation metadatadefinition
- the query modelqueryState
- the query state
-
appendForUpdate
protected void appendForUpdate(AbstractSqlLikeQueryBuilder2.QueryPosition queryPosition, QueryBuilder2.SelectQueryDefinition definition, StringBuilder queryBuilder) Adds "forUpdate" pessimistic locking.- Parameters:
queryPosition
- The query positiondefinition
- The definitionqueryBuilder
- The builder
-
appendUpdateSetParameter
protected void appendUpdateSetParameter(StringBuilder sb, String alias, PersistentProperty prop, Runnable appendParameter) Appends the SET=? call to the query string.- Parameters:
sb
- The string builderalias
- The aliasprop
- The propertyappendParameter
- The append parameter action
-
appendTransformed
Appends custom query part.- Parameters:
sb
- The string buildertransformed
- The transformed query partappendParameter
- The append parameter action
-
computePropertyPaths
protected abstract boolean computePropertyPaths()Whether property path expressions require computation by the implementation. In a certain query dialects property paths are supported (such as JPA-QL where you can do select foo.bar) whilst for explicit SQL queries paths like this have to be computed into aliases / column name references.- Returns:
- True if property path computation is required.
-
buildUpdate
public QueryResult buildUpdate(@NonNull @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull @NonNull QueryBuilder2.UpdateQueryDefinition definition) Description copied from interface:QueryBuilder2
Encode the given query into the encoded query instance.- Specified by:
buildUpdate
in interfaceQueryBuilder2
- Parameters:
annotationMetadata
- The annotation metadatadefinition
- The definition- Returns:
- The encoded query
-
buildDelete
public QueryResult buildDelete(@NonNull @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull @NonNull QueryBuilder2.DeleteQueryDefinition definition) Description copied from interface:QueryBuilder2
Encode the given query into the encoded query instance.- Specified by:
buildDelete
in interfaceQueryBuilder2
- Parameters:
annotationMetadata
- The annotation metadatadefinition
- The query definition- Returns:
- The encoded query
-
isAliasForBatch
protected abstract boolean isAliasForBatch(PersistentEntity persistentEntity, io.micronaut.core.annotation.AnnotationMetadata annotationMetadata) Should aliases be used in batch statements.- Parameters:
persistentEntity
- the persistent entityannotationMetadata
- the method annotation metadata- Returns:
- True if they should
-
appendDeleteClause
Append the delete clause.- Parameters:
queryString
- The query string- Returns:
- The delete clause
-
buildOrderBy
@NonNull public @NonNull QueryResult buildOrderBy(String query, @NonNull @NonNull PersistentEntity entity, @NonNull @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, @NonNull @NonNull Sort sort, boolean nativeQuery) Encode the given query into the encoded query instance.- Parameters:
query
- The queryentity
- The root entityannotationMetadata
- The annotation metadatasort
- The sortnativeQuery
- Whether the query is native query, in which case sort field names will be supplied by the user and not verified- Returns:
- The encoded query
-
buildPropertyByName
public String buildPropertyByName(@NonNull @NonNull String propertyName, @NonNull @NonNull String query, @NonNull @NonNull PersistentEntity entity, @NonNull @NonNull io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, boolean nativeQuery) Encode the given property retrieval into a query instance. For example, property name might be encoded as`person_.name`
using its path and table's alias.- Parameters:
propertyName
- The name of the propertyquery
- The queryentity
- The root entityannotationMetadata
- The annotation metadatanativeQuery
- Whether the query is native query, in which case the property name will be supplied by the user and not verified- Returns:
- The encoded query
-
asPath
Join associations and property as path.- Parameters:
associations
- The associationsproperty
- The property- Returns:
- joined path
-
newBindingContext
protected BindingParameter.BindingContext newBindingContext(@Nullable @Nullable PersistentPropertyPath ref) Creates new binding parameter context.- Parameters:
ref
- the persistent property reference- Returns:
- new binding parameter context
-
getDataTransformerReadValue
Returns transformed value if the data transformer id defined.- Parameters:
alias
- query table aliasprop
- a property- Returns:
- optional transformed value
-
getDataTransformerWriteValue
Returns transformed value if the data transformer id defined.- Parameters:
alias
- query table aliasprop
- a property- Returns:
- optional transformed value
-
formatParameter
Format the parameter at the given index.- Parameters:
index
- The parameter- Returns:
- The index
-
resolveJoinType
Resolves the join type.- Parameters:
jt
- The join type- Returns:
- The join type.
-
getColumnAlias
Gets column alias if defined as alias field on MappedProperty annotation on the mapping field.- Parameters:
property
- the persistent property- Returns:
- column alias if defined, otherwise an empty string
-
checkDialectSupportsJsonEntity
If and whenEntityRepresentation
annotation with JSON type is used for the repository method but dialect does not support JSON entity representations this will throwIllegalArgumentException
.- Parameters:
entity
- the persistent entity
-
isJsonEntity
protected boolean isJsonEntity(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, PersistentEntity entity) Checks whetherEntityRepresentation
annotation with JSON type is used for the repository method. If current dialect does not support handling JSON entity representations,IllegalArgumentException
is thrown.- Parameters:
annotationMetadata
- the annotation metadataentity
- the persistent entity- Returns:
- true if
EntityRepresentation
annotation with JSON type is used for the repository method
-
appendExpression
protected final void appendExpression(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, StringBuilder query, AbstractSqlLikeQueryBuilder2.QueryState queryState, jakarta.persistence.criteria.Expression<?> expression, boolean isProjection) -
appendPropertyRef
protected final void appendPropertyRef(io.micronaut.core.annotation.AnnotationMetadata annotationMetadata, StringBuilder query, AbstractSqlLikeQueryBuilder2.QueryState queryState, PersistentPropertyPath pp, boolean isProjection)
-