mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-27 14:30:16 +00:00
Added Initializer de-duplication handling
This commit is contained in:
parent
4074c39264
commit
26f6c9271a
@ -34,6 +34,5 @@ CollectionInitializer produceInitializer(
|
||||
LockMode lockMode,
|
||||
DomainResultAssembler keyContainerAssembler,
|
||||
DomainResultAssembler keyCollectionAssembler,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState);
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
import org.hibernate.internal.CoreMessageLogger;
|
||||
import org.hibernate.persister.collection.CollectionPersister;
|
||||
import org.hibernate.pretty.MessageHelper;
|
||||
import org.hibernate.sql.results.internal.ResultsHelper;
|
||||
import org.hibernate.stat.spi.StatisticsImplementor;
|
||||
|
||||
/**
|
||||
@ -94,7 +95,7 @@ private void handlePotentiallyEmptyCollection(
|
||||
CollectionPersister ceLoadedPersister) {
|
||||
if ( !collection.wasInitialized() ) {
|
||||
collection.initializeEmptyCollection( ceLoadedPersister );
|
||||
org.hibernate.sql.results.internal.Helper.finalizeCollectionLoading(
|
||||
ResultsHelper.finalizeCollectionLoading(
|
||||
source.getPersistenceContext(),
|
||||
ceLoadedPersister,
|
||||
collection,
|
||||
|
@ -20,8 +20,8 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class LoggingHelper {
|
||||
private static final String NULL = "<null>";
|
||||
private static final String UNREFERENCED = "<unreferenced>";
|
||||
public static final String NULL = "<null>";
|
||||
public static final String UNREFERENCED = "<unreferenced>";
|
||||
|
||||
public static String toLoggableString(NavigableRole role) {
|
||||
if ( role == null ) {
|
||||
|
@ -12,7 +12,6 @@
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.NotYetImplementedFor6Exception;
|
||||
import org.hibernate.engine.FetchStrategy;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||
@ -44,7 +43,6 @@
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableValuedFetchable;
|
||||
import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableFetchImpl;
|
||||
import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableResultImpl;
|
||||
import org.hibernate.type.CompositeType;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
/**
|
||||
|
@ -402,9 +402,7 @@ public Fetch generateFetch(
|
||||
null,
|
||||
SqlAstJoinType.LEFT,
|
||||
lockMode,
|
||||
creationState.getSqlAliasBaseManager(),
|
||||
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
|
||||
creationState.getSqlAstCreationState().getCreationContext()
|
||||
creationState.getSqlAstCreationState()
|
||||
);
|
||||
return tableGroupJoin.getJoinedGroup();
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
import org.hibernate.property.access.spi.PropertyAccess;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.ast.SqlAstJoinType;
|
||||
import org.hibernate.sql.ast.spi.FromClauseAccess;
|
||||
import org.hibernate.sql.ast.spi.SqlAliasBase;
|
||||
import org.hibernate.sql.ast.spi.SqlAliasBaseGenerator;
|
||||
import org.hibernate.sql.ast.spi.SqlAliasStemHelper;
|
||||
@ -273,35 +274,37 @@ public EntityFetch generateFetch(
|
||||
String resultVariable,
|
||||
DomainResultCreationState creationState) {
|
||||
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
|
||||
final TableGroup lhsTableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup(
|
||||
final FromClauseAccess fromClauseAccess = sqlAstCreationState.getFromClauseAccess();
|
||||
|
||||
final TableGroup parentTableGroup = fromClauseAccess.getTableGroup(
|
||||
fetchParent.getNavigablePath()
|
||||
);
|
||||
|
||||
if ( fetchTiming == FetchTiming.IMMEDIATE && selected ) {
|
||||
if ( sqlAstCreationState.getFromClauseAccess().findTableGroup( fetchablePath ) == null ) {
|
||||
SqlAstJoinType sqlAstJoinType;
|
||||
if ( isNullable ) {
|
||||
sqlAstJoinType = SqlAstJoinType.LEFT;
|
||||
}
|
||||
else {
|
||||
sqlAstJoinType = SqlAstJoinType.INNER;
|
||||
}
|
||||
final TableGroupJoin tableGroupJoin = createTableGroupJoin(
|
||||
fetchablePath,
|
||||
lhsTableGroup,
|
||||
null,
|
||||
sqlAstJoinType,
|
||||
lockMode,
|
||||
creationState.getSqlAliasBaseManager(),
|
||||
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
|
||||
creationState.getSqlAstCreationState().getCreationContext()
|
||||
);
|
||||
fromClauseAccess.resolveTableGroup(
|
||||
fetchablePath,
|
||||
np -> {
|
||||
final SqlAstJoinType sqlAstJoinType;
|
||||
if ( isNullable ) {
|
||||
sqlAstJoinType = SqlAstJoinType.LEFT;
|
||||
}
|
||||
else {
|
||||
sqlAstJoinType = SqlAstJoinType.INNER;
|
||||
}
|
||||
|
||||
sqlAstCreationState.getFromClauseAccess().registerTableGroup(
|
||||
fetchablePath,
|
||||
tableGroupJoin.getJoinedGroup()
|
||||
);
|
||||
}
|
||||
|
||||
final TableGroupJoin tableGroupJoin = createTableGroupJoin(
|
||||
fetchablePath,
|
||||
parentTableGroup,
|
||||
null,
|
||||
sqlAstJoinType,
|
||||
lockMode,
|
||||
creationState.getSqlAstCreationState()
|
||||
);
|
||||
|
||||
return tableGroupJoin.getJoinedGroup();
|
||||
}
|
||||
);
|
||||
|
||||
return new EntityFetchJoinedImpl(
|
||||
fetchParent,
|
||||
@ -317,11 +320,11 @@ public EntityFetch generateFetch(
|
||||
final DomainResult keyResult;
|
||||
|
||||
if ( referringPrimaryKey ) {
|
||||
keyResult = foreignKeyDescriptor.createDomainResult( fetchablePath, lhsTableGroup, creationState );
|
||||
keyResult = foreignKeyDescriptor.createDomainResult( fetchablePath, parentTableGroup, creationState );
|
||||
}
|
||||
else {
|
||||
keyResult = ( (EntityPersister) getDeclaringType() ).getIdentifierMapping()
|
||||
.createDomainResult( fetchablePath, lhsTableGroup, null, creationState );
|
||||
.createDomainResult( fetchablePath, parentTableGroup, null, creationState );
|
||||
}
|
||||
|
||||
assert !selected;
|
||||
|
@ -125,7 +125,7 @@ public String getIdentifierForTableGroup() {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getClass().getSimpleName() + "[" + fullPath + "]";
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -610,8 +610,7 @@ private void consumeAttributeJoin(SqmAttributeJoin<?,?> sqmJoin, TableGroup lhsT
|
||||
sqmJoin.getExplicitAlias(),
|
||||
sqmJoin.getSqmJoinType().getCorrespondingSqlJoinType(),
|
||||
determineLockMode( sqmJoin.getExplicitAlias() ),
|
||||
sqlAliasBaseManager, getSqlExpressionResolver(),
|
||||
creationContext
|
||||
this
|
||||
);
|
||||
joinedTableGroup = joinedTableGroupJoin.getJoinedGroup();
|
||||
|
||||
@ -642,8 +641,7 @@ else if ( pathSource instanceof EmbeddedSqmPathSource ) {
|
||||
sqmJoin.getExplicitAlias(),
|
||||
sqmJoin.getSqmJoinType().getCorrespondingSqlJoinType(),
|
||||
determineLockMode( sqmJoin.getExplicitAlias() ),
|
||||
sqlAliasBaseManager, getSqlExpressionResolver(),
|
||||
creationContext
|
||||
this
|
||||
);
|
||||
|
||||
joinedTableGroup = joinedTableGroupJoin.getJoinedGroup();
|
||||
@ -684,9 +682,7 @@ sqlAliasBaseManager, getSqlExpressionResolver(),
|
||||
sqmJoin.getExplicitAlias(),
|
||||
sqmJoin.getSqmJoinType().getCorrespondingSqlJoinType(),
|
||||
determineLockMode( sqmJoin.getExplicitAlias() ),
|
||||
sqlAliasBaseManager,
|
||||
getSqlExpressionResolver(),
|
||||
creationContext
|
||||
this
|
||||
);
|
||||
|
||||
joinedTableGroup = joinedTableGroupJoin.getJoinedGroup();
|
||||
@ -802,9 +798,7 @@ private void consumeImplicitJoins(SqmPath<?> sqmPath, TableGroup tableGroup) {
|
||||
null,
|
||||
tableGroup.isInnerJoinPossible() ? SqlAstJoinType.INNER : SqlAstJoinType.LEFT,
|
||||
null,
|
||||
sqlAliasBaseManager,
|
||||
getSqlExpressionResolver(),
|
||||
creationContext
|
||||
this
|
||||
);
|
||||
|
||||
fromClauseIndex.register( joinedPath, tableGroupJoin.getJoinedGroup() );
|
||||
|
@ -388,9 +388,7 @@ else if ( fetchDepth > maxDepth ) {
|
||||
alias,
|
||||
SqlAstJoinType.LEFT,
|
||||
LockMode.NONE,
|
||||
getSqlAliasBaseManager(),
|
||||
getSqlExpressionResolver(),
|
||||
getCreationContext()
|
||||
this
|
||||
);
|
||||
return tableGroupJoin.getJoinedGroup();
|
||||
}
|
||||
|
@ -6,67 +6,29 @@
|
||||
*/
|
||||
package org.hibernate.sql.ast;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.NotYetImplementedFor6Exception;
|
||||
import org.hibernate.SortOrder;
|
||||
import org.hibernate.query.sqm.tree.expression.Conversion;
|
||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
||||
import org.hibernate.sql.ast.tree.SqlAstTreeLogger;
|
||||
import org.hibernate.sql.ast.tree.Statement;
|
||||
import org.hibernate.sql.ast.tree.delete.DeleteStatement;
|
||||
import org.hibernate.sql.ast.tree.expression.Any;
|
||||
import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.CaseSearchedExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.CaseSimpleExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.CastTarget;
|
||||
import org.hibernate.sql.ast.tree.expression.ColumnReference;
|
||||
import org.hibernate.sql.ast.tree.expression.Distinct;
|
||||
import org.hibernate.sql.ast.tree.expression.Duration;
|
||||
import org.hibernate.sql.ast.tree.expression.DurationUnit;
|
||||
import org.hibernate.sql.ast.tree.expression.EntityTypeLiteral;
|
||||
import org.hibernate.sql.ast.tree.expression.Every;
|
||||
import org.hibernate.sql.ast.tree.expression.ExtractUnit;
|
||||
import org.hibernate.sql.ast.tree.expression.Format;
|
||||
import org.hibernate.sql.ast.tree.expression.JdbcLiteral;
|
||||
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
|
||||
import org.hibernate.sql.ast.tree.expression.QueryLiteral;
|
||||
import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.SqlSelectionExpression;
|
||||
import org.hibernate.sql.ast.tree.expression.SqlTuple;
|
||||
import org.hibernate.sql.ast.tree.expression.Star;
|
||||
import org.hibernate.sql.ast.tree.expression.TrimSpecification;
|
||||
import org.hibernate.sql.ast.tree.expression.UnaryOperation;
|
||||
import org.hibernate.sql.ast.tree.from.FromClause;
|
||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
|
||||
import org.hibernate.sql.ast.tree.from.TableReference;
|
||||
import org.hibernate.sql.ast.tree.from.TableReferenceJoin;
|
||||
import org.hibernate.sql.ast.tree.insert.InsertStatement;
|
||||
import org.hibernate.sql.ast.tree.predicate.BetweenPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.ExistsPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.FilterPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.GroupedPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.InListPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.Junction;
|
||||
import org.hibernate.sql.ast.tree.predicate.LikePredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.NegatedPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.NullnessPredicate;
|
||||
import org.hibernate.sql.ast.tree.predicate.SelfRenderingPredicate;
|
||||
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||
import org.hibernate.sql.ast.tree.select.SelectClause;
|
||||
import org.hibernate.sql.ast.tree.select.SelectStatement;
|
||||
import org.hibernate.sql.ast.tree.select.SortSpecification;
|
||||
import org.hibernate.sql.ast.tree.update.Assignment;
|
||||
import org.hibernate.sql.ast.tree.update.UpdateStatement;
|
||||
|
||||
/**
|
||||
* Logs a debug representation of the SQL AST.
|
||||
*
|
||||
* NOTE : at the moment, we only render the from-elements
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class SqlTreePrinter implements SqlAstWalker {
|
||||
public static void print(Statement sqlAstStatement) {
|
||||
public class SqlTreePrinter {
|
||||
public static void logSqlAst(Statement sqlAstStatement) {
|
||||
if ( ! SqlAstTreeLogger.DEBUG_ENABLED ) {
|
||||
return;
|
||||
}
|
||||
@ -85,88 +47,37 @@ private SqlTreePrinter() {
|
||||
|
||||
private void visitStatement(Statement sqlAstStatement) {
|
||||
if ( sqlAstStatement instanceof SelectStatement ) {
|
||||
final SelectStatement selectStatement = (SelectStatement) sqlAstStatement;
|
||||
logNode(
|
||||
"select-statement",
|
||||
() -> visitQuerySpec( ( (SelectStatement) sqlAstStatement ).getQuerySpec() )
|
||||
"SelectStatement",
|
||||
() -> visitFromClause( selectStatement.getQuerySpec().getFromClause() )
|
||||
);
|
||||
}
|
||||
else if ( sqlAstStatement instanceof DeleteStatement ) {
|
||||
final DeleteStatement deleteStatement = (DeleteStatement) sqlAstStatement;
|
||||
logNode(
|
||||
"delete-statement",
|
||||
() -> {
|
||||
logNode(
|
||||
"target",
|
||||
() -> logNode( deleteStatement.getTargetTable().toString() )
|
||||
);
|
||||
logNode(
|
||||
"where",
|
||||
() -> {
|
||||
if ( deleteStatement.getRestriction() != null ) {
|
||||
deleteStatement.getRestriction().accept( this );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
"DeleteStatement",
|
||||
() -> logWithIndentation(
|
||||
"target : " + deleteStatement.getTargetTable().getTableExpression()
|
||||
)
|
||||
);
|
||||
}
|
||||
else if ( sqlAstStatement instanceof UpdateStatement ) {
|
||||
final UpdateStatement updateStatement = (UpdateStatement) sqlAstStatement;
|
||||
logNode(
|
||||
"update-statement",
|
||||
() -> {
|
||||
logNode(
|
||||
"target",
|
||||
() -> logNode( updateStatement.getTargetTable().toString() )
|
||||
);
|
||||
logNode(
|
||||
"set",
|
||||
() -> {
|
||||
for ( Assignment assignment : updateStatement.getAssignments() ) {
|
||||
logNode(
|
||||
"assignment",
|
||||
() -> assignment.accept( this ),
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
logNode(
|
||||
"where",
|
||||
() -> {
|
||||
if ( updateStatement.getRestriction() != null ) {
|
||||
updateStatement.getRestriction().accept( this );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
"UpdateStatement",
|
||||
() -> logWithIndentation(
|
||||
"target : " + updateStatement.getTargetTable().getTableExpression()
|
||||
)
|
||||
);
|
||||
}
|
||||
else if ( sqlAstStatement instanceof InsertStatement) {
|
||||
final InsertStatement insertStatement = (InsertStatement) sqlAstStatement;
|
||||
logNode(
|
||||
"insert-select-statement",
|
||||
() -> {
|
||||
logNode(
|
||||
"target",
|
||||
() -> logNode( insertStatement.getTargetTable().toString() )
|
||||
);
|
||||
logNode(
|
||||
"into",
|
||||
() -> {
|
||||
for ( ColumnReference spec : insertStatement.getTargetColumnReferences() ) {
|
||||
logNode(
|
||||
"target-column",
|
||||
() -> spec.accept( this )
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
logNode(
|
||||
"select",
|
||||
() -> visitQuerySpec( insertStatement.getSourceSelectStatement() )
|
||||
);
|
||||
}
|
||||
"InsertStatement",
|
||||
() -> logWithIndentation(
|
||||
"target : " + insertStatement.getTargetTable().getTableExpression()
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
@ -174,16 +85,69 @@ else if ( sqlAstStatement instanceof InsertStatement) {
|
||||
}
|
||||
}
|
||||
|
||||
private void visitFromClause(FromClause fromClause) {
|
||||
logNode(
|
||||
"FromClause",
|
||||
() -> fromClause.visitRoots( this::visitTableGroup )
|
||||
);
|
||||
}
|
||||
|
||||
private void visitTableGroup(TableGroup tableGroup) {
|
||||
logNode(
|
||||
toDisplayText( tableGroup ),
|
||||
() -> logTableGroupDetails( tableGroup )
|
||||
);
|
||||
}
|
||||
|
||||
private String toDisplayText(TableGroup tableGroup) {
|
||||
return tableGroup.getClass().getSimpleName() + " ("
|
||||
+ tableGroup.getGroupAlias() + " : "
|
||||
+ tableGroup.getNavigablePath()
|
||||
+ ")";
|
||||
}
|
||||
|
||||
private void logTableGroupDetails(TableGroup tableGroup) {
|
||||
logWithIndentation(
|
||||
"primaryTableReference : %s as %s",
|
||||
tableGroup.getPrimaryTableReference().getTableExpression(),
|
||||
tableGroup.getPrimaryTableReference().getIdentificationVariable()
|
||||
);
|
||||
|
||||
final List<TableReferenceJoin> tableReferenceJoins = tableGroup.getTableReferenceJoins();
|
||||
if ( ! tableReferenceJoins.isEmpty() ) {
|
||||
logNode(
|
||||
"TableReferenceJoins",
|
||||
() -> {
|
||||
for ( TableReferenceJoin join : tableReferenceJoins ) {
|
||||
logWithIndentation(
|
||||
"%s join %s as %s",
|
||||
join.getJoinType().getText(),
|
||||
join.getJoinedTableReference().getTableExpression(),
|
||||
join.getJoinedTableReference().getIdentificationVariable()
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
final Set<TableGroupJoin> tableGroupJoins = tableGroup.getTableGroupJoins();
|
||||
if ( ! tableGroupJoins.isEmpty() ) {
|
||||
logNode(
|
||||
"TableGroupJoins",
|
||||
() -> tableGroup.visitTableGroupJoins( this::visitTableGroupJoin )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void visitTableGroupJoin(TableGroupJoin tableGroupJoin) {
|
||||
logNode(
|
||||
tableGroupJoin.getJoinType().getText() + " join " + toDisplayText( tableGroupJoin.getJoinedGroup() ),
|
||||
() -> logTableGroupDetails( tableGroupJoin.getJoinedGroup() )
|
||||
);
|
||||
}
|
||||
|
||||
private void logNode(String text) {
|
||||
logWithIndentation( "-> [%s]", text );
|
||||
}
|
||||
|
||||
private void logNode(String pattern, Object arg) {
|
||||
logWithIndentation( "-> [" + String.format( pattern, arg ) + ']');
|
||||
}
|
||||
|
||||
private void logNode(String pattern, Object arg, Object arg2) {
|
||||
logWithIndentation( "-> [" + String.format( pattern, arg, arg2 ) + ']');
|
||||
logWithIndentation( "%s", text );
|
||||
}
|
||||
|
||||
private void logNode(String text, Runnable subTreeHandler) {
|
||||
@ -191,7 +155,7 @@ private void logNode(String text, Runnable subTreeHandler) {
|
||||
}
|
||||
|
||||
private void logNode(String text, Runnable subTreeHandler, boolean indentContinuation) {
|
||||
logWithIndentation( "-> [%s]", text );
|
||||
logWithIndentation( "%s {", text );
|
||||
depth++;
|
||||
|
||||
try {
|
||||
@ -210,7 +174,7 @@ private void logNode(String text, Runnable subTreeHandler, boolean indentContinu
|
||||
}
|
||||
|
||||
depth--;
|
||||
logWithIndentation( "<- [%s]", text );
|
||||
logWithIndentation( "}", text );
|
||||
}
|
||||
|
||||
private void logWithIndentation(Object line) {
|
||||
@ -226,8 +190,8 @@ private void logWithIndentation(String pattern, Object arg1, Object arg2) {
|
||||
logWithIndentation( String.format( pattern, arg1, arg2 ) );
|
||||
}
|
||||
|
||||
private void logWithIndentation(String pattern, Object... args) {
|
||||
logWithIndentation( String.format( pattern, args ) );
|
||||
private void logWithIndentation(String pattern, Object arg1, Object arg2, Object arg3) {
|
||||
logWithIndentation( String.format( pattern, arg1, arg2, arg3 ) );
|
||||
}
|
||||
|
||||
private void pad(int depth) {
|
||||
@ -236,532 +200,4 @@ private void pad(int depth) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitAssignment(Assignment assignment) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitQuerySpec(QuerySpec querySpec) {
|
||||
logNode(
|
||||
"query-spec",
|
||||
() -> {
|
||||
visitSelectClause( querySpec.getSelectClause() );
|
||||
visitFromClause( querySpec.getFromClause() );
|
||||
|
||||
if ( querySpec.getWhereClauseRestrictions() != null && ! querySpec.getWhereClauseRestrictions().isEmpty() ) {
|
||||
logNode(
|
||||
"where",
|
||||
() -> querySpec.getWhereClauseRestrictions().accept( this )
|
||||
);
|
||||
}
|
||||
|
||||
// todo (6.0) : group-by
|
||||
// todo (6.0) : having
|
||||
|
||||
if ( ! querySpec.getSortSpecifications().isEmpty() ) {
|
||||
logNode(
|
||||
"order-by",
|
||||
() -> {
|
||||
for ( SortSpecification sortSpecification : querySpec.getSortSpecifications() ) {
|
||||
visitSortSpecification( sortSpecification );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
if ( querySpec.getLimitClauseExpression() != null ) {
|
||||
logNode(
|
||||
"limit",
|
||||
() -> querySpec.getLimitClauseExpression().accept( this )
|
||||
);
|
||||
}
|
||||
|
||||
if ( querySpec.getOffsetClauseExpression() != null ) {
|
||||
logNode(
|
||||
"offset",
|
||||
() -> querySpec.getOffsetClauseExpression().accept( this )
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSortSpecification(SortSpecification sortSpecification) {
|
||||
logNode(
|
||||
"sort",
|
||||
() -> {
|
||||
sortSpecification.getSortExpression().accept( this );
|
||||
logNode(
|
||||
sortSpecification.getSortOrder() == null
|
||||
? SortOrder.ASCENDING.name()
|
||||
: sortSpecification.getSortOrder().name()
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitLimitOffsetClause(QuerySpec querySpec) {
|
||||
throw new UnsupportedOperationException( "Unexpected call to #visitLimitOffsetClause" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSelectClause(SelectClause selectClause) {
|
||||
logNode(
|
||||
"select",
|
||||
() -> {
|
||||
for ( SqlSelection sqlSelection : selectClause.getSqlSelections() ) {
|
||||
visitSqlSelection( sqlSelection );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSqlSelection(SqlSelection sqlSelection) {
|
||||
logWithIndentation( "selection - " + sqlSelection );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitFromClause(FromClause fromClause) {
|
||||
logNode(
|
||||
"from",
|
||||
() -> fromClause.visitRoots( this::visitTableGroup )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTableGroup(TableGroup tableGroup) {
|
||||
logNode(
|
||||
"table-group",
|
||||
() -> {
|
||||
visitTableReference( tableGroup.getPrimaryTableReference() );
|
||||
|
||||
for ( TableReferenceJoin join : tableGroup.getTableReferenceJoins() ) {
|
||||
visitTableReferenceJoin( join );
|
||||
}
|
||||
|
||||
tableGroup.visitTableGroupJoins( this::visitTableGroupJoin );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTableGroupJoin(TableGroupJoin tableGroupJoin) {
|
||||
logNode(
|
||||
"table-group-join",
|
||||
() -> {
|
||||
visitTableGroup( tableGroupJoin.getJoinedGroup() );
|
||||
logNode( tableGroupJoin.getJoinType().getText() );
|
||||
logNode(
|
||||
"on",
|
||||
() -> tableGroupJoin.getPredicate().accept( this )
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTableReference(TableReference tableReference) {
|
||||
logNode( tableReference.getTableExpression() + " as " + tableReference.getIdentificationVariable() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTableReferenceJoin(TableReferenceJoin tableReferenceJoin) {
|
||||
logNode(
|
||||
"join",
|
||||
() -> {
|
||||
visitTableReference( tableReferenceJoin.getJoinedTableReference() );
|
||||
logNode( tableReferenceJoin.getJoinType().getText() );
|
||||
logNode(
|
||||
"on",
|
||||
() -> tableReferenceJoin.getJoinPredicate().accept( this )
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitColumnReference(ColumnReference columnReference) {
|
||||
logNode( "{%s}.{%s}", columnReference.getQualifier(), columnReference.getColumnExpression() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitExtractUnit(ExtractUnit extractUnit) {
|
||||
logNode( extractUnit.getUnit().toString() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitFormat(Format format) {
|
||||
logNode( format.getFormat() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitDistinct(Distinct distinct) {
|
||||
logNode( "{distinct}" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitStar(Star star) {
|
||||
logNode( "{*}" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTrimSpecification(TrimSpecification trimSpecification) {
|
||||
logNode( "{" + trimSpecification.getSpecification().toSqlText() + "}" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitCastTarget(CastTarget castTarget) {
|
||||
logNode( "`" + castTarget.getExpressionType().getJdbcMapping().getSqlTypeDescriptor() + "`" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitBinaryArithmeticExpression(BinaryArithmeticExpression expression) {
|
||||
logNode(
|
||||
expression.getOperator().getOperatorSqlTextString(),
|
||||
() -> {
|
||||
expression.getLeftHandOperand().accept( this );
|
||||
expression.getRightHandOperand().accept( this );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSqlSelectionExpression(SqlSelectionExpression expression) {
|
||||
logNode( "selection-reference (%s)", expression.getSelection().getJdbcResultSetIndex() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitEntityTypeLiteral(EntityTypeLiteral expression) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitTuple(SqlTuple tuple) {
|
||||
logNode(
|
||||
"tuple",
|
||||
() -> tuple.getExpressions().forEach( expr -> expr.accept( this ) )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitParameter(JdbcParameter jdbcParameter) {
|
||||
logNode( "parameter" );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitCaseSearchedExpression(CaseSearchedExpression caseSearchedExpression) {
|
||||
throw new NotYetImplementedFor6Exception();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitCaseSimpleExpression(CaseSimpleExpression caseSimpleExpression) {
|
||||
throw new NotYetImplementedFor6Exception();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitAny(Any any) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitEvery(Every every) {
|
||||
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void visitCoalesceFunction(CoalesceFunction coalesceExpression) {
|
||||
// throw new NotYetImplementedFor6Exception();
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitNamedParameter(NamedParameter namedParameter) {
|
||||
// logNode( "named-param (%s)", namedParameter.getName() );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitGenericParameter(GenericParameter parameter) {
|
||||
// logNode( "generic-param" );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitPositionalParameter(PositionalParameter parameter) {
|
||||
// logNode( "positional-param (%s)", parameter.getPosition() );
|
||||
// }
|
||||
|
||||
|
||||
@Override
|
||||
public void visitJdbcLiteral(JdbcLiteral jdbcLiteral) {
|
||||
logNode( "literal (" + jdbcLiteral.getLiteralValue() + ')' );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitQueryLiteral(QueryLiteral queryLiteral) {
|
||||
logNode( "literal (" + queryLiteral.getLiteralValue() + ')' );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitUnaryOperationExpression(UnaryOperation operation) {
|
||||
logNode(
|
||||
operation.getOperator().name().toLowerCase( Locale.ROOT ),
|
||||
() -> operation.getOperand().accept( this )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitBetweenPredicate(BetweenPredicate betweenPredicate) {
|
||||
logNode(
|
||||
"between",
|
||||
() -> {
|
||||
betweenPredicate.getExpression().accept( this );
|
||||
betweenPredicate.getLowerBound().accept( this );
|
||||
betweenPredicate.getUpperBound().accept( this );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitFilterPredicate(FilterPredicate filterPredicate) {
|
||||
logNode(
|
||||
"filter-predicate",
|
||||
() -> {
|
||||
logNode( filterPredicate.getFilterFragment() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitGroupedPredicate(GroupedPredicate groupedPredicate) {
|
||||
logNode(
|
||||
"grouped-predicate",
|
||||
() -> groupedPredicate.getSubPredicate().accept( this )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitInListPredicate(InListPredicate inListPredicate) {
|
||||
logNode(
|
||||
"in",
|
||||
() -> {
|
||||
inListPredicate.getTestExpression().accept( this );
|
||||
logNode(
|
||||
"list",
|
||||
() -> inListPredicate.getListExpressions().forEach( expr -> expr.accept( this ) )
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitInSubQueryPredicate(InSubQueryPredicate inSubQueryPredicate) {
|
||||
logNode(
|
||||
"in",
|
||||
() -> {
|
||||
inSubQueryPredicate.getTestExpression().accept( this );
|
||||
visitQuerySpec( inSubQueryPredicate.getSubQuery() );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitExistsPredicate(ExistsPredicate existsPredicate) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitJunction(Junction junction) {
|
||||
logNode(
|
||||
junction.getNature().name().toLowerCase(),
|
||||
() -> junction.getPredicates().forEach( predicate -> predicate.accept( this ) )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitLikePredicate(LikePredicate likePredicate) {
|
||||
logNode(
|
||||
"like",
|
||||
() -> {
|
||||
likePredicate.getMatchExpression().accept( this );
|
||||
likePredicate.getPattern().accept( this );
|
||||
if ( likePredicate.getEscapeCharacter() != null ) {
|
||||
likePredicate.getEscapeCharacter().accept( this );
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitNegatedPredicate(NegatedPredicate negatedPredicate) {
|
||||
logNode(
|
||||
"not",
|
||||
() -> negatedPredicate.getPredicate().accept( this )
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitNullnessPredicate(NullnessPredicate nullnessPredicate) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitRelationalPredicate(ComparisonPredicate comparisonPredicate) {
|
||||
logNode(
|
||||
comparisonPredicate.getOperator().name().toLowerCase( Locale.ROOT ),
|
||||
() -> {
|
||||
comparisonPredicate.getLeftHandExpression().accept( this );
|
||||
comparisonPredicate.getRightHandExpression().accept( this );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSelfRenderingPredicate(SelfRenderingPredicate selfRenderingPredicate) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitSelfRenderingExpression(SelfRenderingExpression expression) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitDurationUnit(DurationUnit durationUnit) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitDuration(Duration duration) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitConversion(Conversion conversion) {
|
||||
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void visitNonStandardFunctionExpression(NonStandardFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitAbsFunction(AbsFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitAvgFunction(AvgFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitBitLengthFunction(BitLengthFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitCastFunction(CastFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitConcatFunction(ConcatFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitSubstrFunction(SubstrFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitCountFunction(CountFunction function) {
|
||||
// logNode(
|
||||
// "count",
|
||||
// () -> function.getArgument().accept( this )
|
||||
// );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitCountStarFunction(CountStarFunction function) {
|
||||
// logNode( "count(*)" );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitCurrentDateFunction(CurrentDateFunction function) {
|
||||
// logNode( "current_date" );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitCurrentTimeFunction(CurrentTimeFunction function) {
|
||||
// logNode( "current_time" );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitCurrentTimestampFunction(CurrentTimestampFunction function) {
|
||||
// logNode( "current_timestamp" );
|
||||
// }
|
||||
|
||||
// @Override
|
||||
// public void visitExtractFunction(ExtractFunction extractFunction) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitLengthFunction(LengthFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitLocateFunction(LocateFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitLowerFunction(LowerFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitMaxFunction(MaxFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitMinFunction(MinFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitModFunction(ModFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitNullifFunction(NullifFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitSqrtFunction(SqrtFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitSumFunction(SumFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitTrimFunction(TrimFunction function) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void visitUpperFunction(UpperFunction function) {
|
||||
//
|
||||
// }
|
||||
|
||||
}
|
||||
|
@ -20,6 +20,9 @@
|
||||
import org.hibernate.sql.exec.spi.JdbcSelect;
|
||||
import org.hibernate.sql.results.jdbc.internal.JdbcValuesMappingProducerStandard;
|
||||
|
||||
import static org.hibernate.sql.ast.SqlTreePrinter.logSqlAst;
|
||||
import static org.hibernate.sql.results.graph.DomainResultGraphPrinter.logDomainResultGraph;
|
||||
|
||||
/**
|
||||
* The final phase of query translation. Here we take the SQL-AST an
|
||||
* "interpretation". For a select query, that means an instance of
|
||||
@ -81,9 +84,8 @@ public JdbcSelect translate(QuerySpec querySpec) {
|
||||
|
||||
@Override
|
||||
public JdbcSelect translate(SelectStatement sqlAstSelect) {
|
||||
if ( SqlAstTreeLogger.DEBUG_ENABLED ) {
|
||||
SqlTreePrinter.print( sqlAstSelect );
|
||||
}
|
||||
logDomainResultGraph( sqlAstSelect.getDomainResultDescriptors() );
|
||||
logSqlAst( sqlAstSelect );
|
||||
|
||||
visitQuerySpec( sqlAstSelect.getQuerySpec() );
|
||||
|
||||
|
@ -11,12 +11,35 @@
|
||||
import org.hibernate.sql.ast.SqlAstJoinType;
|
||||
import org.hibernate.sql.ast.spi.SqlAliasBaseGenerator;
|
||||
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||
import org.hibernate.sql.ast.spi.SqlAstCreationState;
|
||||
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface TableGroupJoinProducer extends TableGroupProducer {
|
||||
/**
|
||||
* Create a TableGroupJoin as defined for this producer
|
||||
*/
|
||||
default TableGroupJoin createTableGroupJoin(
|
||||
NavigablePath navigablePath,
|
||||
TableGroup lhs,
|
||||
String explicitSourceAlias,
|
||||
SqlAstJoinType sqlAstJoinType,
|
||||
LockMode lockMode,
|
||||
SqlAstCreationState creationState) {
|
||||
return createTableGroupJoin(
|
||||
navigablePath,
|
||||
lhs,
|
||||
explicitSourceAlias,
|
||||
sqlAstJoinType,
|
||||
lockMode,
|
||||
creationState.getSqlAliasBaseGenerator(),
|
||||
creationState.getSqlExpressionResolver(),
|
||||
creationState.getCreationContext()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a TableGroupJoin as defined for this producer
|
||||
*/
|
||||
|
@ -28,7 +28,7 @@
|
||||
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
|
||||
import org.hibernate.sql.exec.spi.JdbcSelect;
|
||||
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
|
||||
import org.hibernate.sql.results.internal.Helper;
|
||||
import org.hibernate.sql.results.internal.ResultsHelper;
|
||||
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;
|
||||
import org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess;
|
||||
import org.hibernate.sql.results.jdbc.internal.JdbcValuesCacheHit;
|
||||
@ -204,7 +204,7 @@ public boolean shouldReturnProxies() {
|
||||
|
||||
final List<AfterLoadAction> afterLoadActions = new ArrayList<>();
|
||||
|
||||
final RowReader<R> rowReader = Helper.createRowReader(
|
||||
final RowReader<R> rowReader = ResultsHelper.createRowReader(
|
||||
executionContext.getSession().getFactory(),
|
||||
afterLoadActions::add,
|
||||
rowTransformer,
|
||||
|
@ -6,11 +6,15 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface AssemblerCreationState {
|
||||
Initializer resolveInitializer(NavigablePath navigablePath, Supplier<Initializer> producer);
|
||||
SqlAstCreationContext getSqlAstCreationContext();
|
||||
}
|
||||
|
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||
*/
|
||||
package org.hibernate.sql.results.graph;
|
||||
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface AssemblerLogger {
|
||||
Logger LOGGER = ResultsLogger.subLogger( "assembler" );
|
||||
|
||||
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
|
||||
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
|
||||
}
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Represents a result value in the domain query results. Acts as the producer for the
|
||||
* {@link DomainResultAssembler} for this result as well as any {@link Initializer} instances needed
|
||||
@ -30,7 +28,5 @@ public interface DomainResult<J> extends DomainResultGraphNode {
|
||||
/**
|
||||
* Create an assembler (and any initializers) for this result.
|
||||
*/
|
||||
DomainResultAssembler<J> createResultAssembler(
|
||||
Consumer<Initializer> initializerCollector,
|
||||
AssemblerCreationState creationState);
|
||||
DomainResultAssembler<J> createResultAssembler(AssemblerCreationState creationState);
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
|
||||
import org.hibernate.internal.util.collections.Stack;
|
||||
import org.hibernate.internal.util.collections.StandardStack;
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
@ -21,21 +22,28 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class DomainResultGraphPrinter {
|
||||
private static final Logger log = Logger.getLogger( DomainResultGraphPrinter.class );
|
||||
private static final Logger log = ResultsLogger.subLogger( "graph.AST" );
|
||||
private static final boolean DEBUG_ENABLED = log.isDebugEnabled();
|
||||
private static final boolean TRACE_ENABLED = log.isTraceEnabled();
|
||||
|
||||
public static void print(List<DomainResult> domainResults) {
|
||||
if ( ! log.isDebugEnabled() ) {
|
||||
public static void logDomainResultGraph(List<DomainResult> domainResults) {
|
||||
logDomainResultGraph( "DomainResult Graph", domainResults );
|
||||
}
|
||||
|
||||
public static void logDomainResultGraph(String header, List<DomainResult> domainResults) {
|
||||
if ( ! DEBUG_ENABLED ) {
|
||||
return;
|
||||
}
|
||||
|
||||
final DomainResultGraphPrinter graphPrinter = new DomainResultGraphPrinter();
|
||||
final DomainResultGraphPrinter graphPrinter = new DomainResultGraphPrinter( header );
|
||||
graphPrinter.visitDomainResults( domainResults );
|
||||
}
|
||||
|
||||
private final StringBuilder buffer = new StringBuilder( "DomainResult Graph:\n");
|
||||
private final StringBuilder buffer;
|
||||
private final Stack<FetchParent> fetchParentStack = new StandardStack<>();
|
||||
|
||||
private DomainResultGraphPrinter() {
|
||||
private DomainResultGraphPrinter(String header) {
|
||||
buffer = new StringBuilder( header + ":" + System.lineSeparator() );
|
||||
}
|
||||
|
||||
private void visitDomainResults(List<DomainResult> domainResults) {
|
||||
@ -50,9 +58,17 @@ private void visitDomainResults(List<DomainResult> domainResults) {
|
||||
}
|
||||
|
||||
log.debug( buffer.toString() );
|
||||
|
||||
if ( TRACE_ENABLED ) {
|
||||
log.tracef( new Exception(), "Stack trace calling DomainResultGraphPrinter" );
|
||||
}
|
||||
}
|
||||
|
||||
private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
|
||||
visitGraphNode( node, lastInBranch, node.getClass().getSimpleName() );
|
||||
}
|
||||
|
||||
private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch, String nodeText) {
|
||||
indentLine();
|
||||
|
||||
if ( lastInBranch ) {
|
||||
@ -62,7 +78,7 @@ private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
|
||||
buffer.append( " +-" );
|
||||
}
|
||||
|
||||
buffer.append( node.getClass().getSimpleName() );
|
||||
buffer.append( nodeText );
|
||||
if ( node.getNavigablePath() != null ) {
|
||||
buffer.append( " [" )
|
||||
.append( node.getNavigablePath().getFullPath() )
|
||||
@ -75,10 +91,20 @@ private void visitGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
|
||||
}
|
||||
}
|
||||
|
||||
private void visitKeyGraphNode(DomainResultGraphNode node, boolean lastInBranch) {
|
||||
visitGraphNode( node, lastInBranch, "(key) " + node.getClass().getSimpleName() );
|
||||
}
|
||||
|
||||
private void visitFetches(FetchParent fetchParent) {
|
||||
fetchParentStack.push( fetchParent );
|
||||
|
||||
try {
|
||||
// final Fetch identifierFetch = fetchParent.getKeyFetch();
|
||||
// if ( identifierFetch != null ) {
|
||||
// final boolean lastInBranch = identifierFetch.getFetchedMapping() instanceof FetchParent;
|
||||
// visitKeyGraphNode( identifierFetch, lastInBranch );
|
||||
// }
|
||||
|
||||
final int numberOfFetches = fetchParent.getFetches().size();
|
||||
|
||||
for ( int i = 0; i < numberOfFetches; i++ ) {
|
||||
|
@ -59,8 +59,5 @@ public interface Fetch extends DomainResultGraphNode {
|
||||
/**
|
||||
* Create the assembler for this fetch
|
||||
*/
|
||||
DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState);
|
||||
DomainResultAssembler createAssembler(FetchParentAccess parentAccess, AssemblerCreationState creationState);
|
||||
}
|
||||
|
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||
*/
|
||||
package org.hibernate.sql.results.graph;
|
||||
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface ResultGraphLogger {
|
||||
Logger LOGGER = ResultsLogger.subLogger( "graph" );
|
||||
|
||||
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
|
||||
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
|
||||
}
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.basic;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
|
||||
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||
@ -19,7 +17,6 @@
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Fetchable;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
/**
|
||||
@ -95,15 +92,12 @@ public NavigablePath getNavigablePath() {
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
return assembler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler<T> createResultAssembler(
|
||||
Consumer<Initializer> initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
|
||||
return assembler;
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,12 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.basic;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.Internal;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
/**
|
||||
@ -93,9 +90,7 @@ public DomainResultAssembler<T> getAssembler() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler<T> createResultAssembler(
|
||||
Consumer<Initializer> initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
|
||||
return assembler;
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection;
|
||||
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
import org.hibernate.sql.results.LoadingLogger;
|
||||
|
||||
import org.jboss.logging.BasicLogger;
|
||||
import org.jboss.logging.Logger;
|
||||
@ -15,12 +15,14 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface CollectionLoadingLogger extends BasicLogger {
|
||||
String LOGGER_NAME = ResultsLogger.LOGGER_NAME + "loading.collection";
|
||||
String LOCAL_NAME = "collection";
|
||||
|
||||
String LOGGER_NAME = LoadingLogger.subLoggerName( LOCAL_NAME );
|
||||
|
||||
/**
|
||||
* Static access to the logging instance
|
||||
*/
|
||||
Logger INSTANCE = Logger.getLogger( LOGGER_NAME );
|
||||
Logger INSTANCE = LoadingLogger.subLogger( LOCAL_NAME );
|
||||
|
||||
boolean TRACE_ENABLED = INSTANCE.isTraceEnabled();
|
||||
boolean DEBUG_ENABLED = INSTANCE.isDebugEnabled();
|
||||
|
@ -6,6 +6,8 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.hibernate.collection.internal.PersistentArrayHolder;
|
||||
import org.hibernate.collection.spi.PersistentCollection;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
@ -25,9 +27,9 @@ public abstract class AbstractCollectionAssembler implements DomainResultAssembl
|
||||
|
||||
public AbstractCollectionAssembler(
|
||||
PluralAttributeMapping fetchedMapping,
|
||||
CollectionInitializer initializer) {
|
||||
Supplier<CollectionInitializer> initializerProducer) {
|
||||
this.fetchedMapping = fetchedMapping;
|
||||
this.initializer = initializer;
|
||||
this.initializer = initializerProducer.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -15,7 +15,6 @@
|
||||
import org.hibernate.engine.spi.PersistenceContext;
|
||||
import org.hibernate.engine.spi.SharedSessionContractImplementor;
|
||||
import org.hibernate.internal.log.LoggingHelper;
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.persister.collection.CollectionPersister;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
@ -71,6 +70,8 @@ public AbstractImmediateCollectionInitializer(
|
||||
this.lockMode = lockMode;
|
||||
}
|
||||
|
||||
protected abstract String getSimpleConcreteImplName();
|
||||
|
||||
@Override
|
||||
public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( collectionInstance != null ) {
|
||||
@ -80,7 +81,7 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.TRACE_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.tracef(
|
||||
"(%s) Beginning Initializer#resolveInstance for collection : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() )
|
||||
);
|
||||
}
|
||||
@ -105,9 +106,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Found existing loading collection entry [%s]; using loading collection instance - %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
LoggingHelper.toLoggableString( collectionInstance )
|
||||
toLoggableString( collectionInstance )
|
||||
);
|
||||
}
|
||||
|
||||
@ -120,7 +121,7 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Collection [%s] being loaded by another initializer [%s] - skipping processing",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
existingLoadingEntry.getInitializer()
|
||||
);
|
||||
@ -142,9 +143,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Found existing collection instance [%s] in Session; skipping processing - [%s]",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
LoggingHelper.toLoggableString( collectionInstance )
|
||||
toLoggableString( collectionInstance )
|
||||
);
|
||||
}
|
||||
|
||||
@ -167,9 +168,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Found existing unowned collection instance [%s] in Session; skipping processing - [%s]",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
LoggingHelper.toLoggableString( collectionInstance )
|
||||
toLoggableString( collectionInstance )
|
||||
);
|
||||
}
|
||||
|
||||
@ -197,9 +198,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Created new collection wrapper [%s] : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
LoggingHelper.toLoggableString( collectionInstance )
|
||||
toLoggableString( collectionInstance )
|
||||
);
|
||||
}
|
||||
|
||||
@ -212,9 +213,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Responsible for loading collection [%s] : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
LoggingHelper.toLoggableString( collectionInstance )
|
||||
toLoggableString( collectionInstance )
|
||||
);
|
||||
}
|
||||
|
||||
@ -226,6 +227,16 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Specialized toString handling for PersistentCollection. All `PersistentCollection#toString`
|
||||
* implementations are crazy expensive as they trigger a load
|
||||
*/
|
||||
private String toLoggableString(PersistentCollection collectionInstance) {
|
||||
return collectionInstance == null
|
||||
? LoggingHelper.NULL
|
||||
: collectionInstance.getClass().getName() + "@" + System.identityHashCode( collectionInstance );
|
||||
}
|
||||
|
||||
protected void takeResponsibility(RowProcessingState rowProcessingState, CollectionKey collectionKey) {
|
||||
responsibility = new LoadingCollectionEntryImpl(
|
||||
getCollectionAttributeMapping().getCollectionDescriptor(),
|
||||
@ -280,7 +291,7 @@ public void resolveKey(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Current row collection key : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), this.collectionKey.getKey() )
|
||||
);
|
||||
}
|
||||
@ -294,7 +305,7 @@ else if ( keyCollectionValue != null ) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Current row collection key : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), this.collectionKey.getKey() )
|
||||
);
|
||||
}
|
||||
@ -343,9 +354,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
|
||||
if ( CollectionLoadingLogger.DEBUG_ENABLED ) {
|
||||
CollectionLoadingLogger.INSTANCE.debugf(
|
||||
"(%s) Reading element from row for collection [%s] -> %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
LoggingHelper.toLoggableString( getNavigablePath(), collectionKey.getKey() ),
|
||||
LoggingHelper.toLoggableString( collectionInstance )
|
||||
toLoggableString( collectionInstance )
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,8 @@
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
public class ArrayInitializer extends AbstractImmediateCollectionInitializer {
|
||||
private static final String CONCRETE_NAME = ArrayInitializer.class.getSimpleName();
|
||||
|
||||
private final DomainResultAssembler listIndexAssembler;
|
||||
private final DomainResultAssembler elementAssembler;
|
||||
|
||||
@ -50,6 +52,11 @@ public ArrayInitializer(
|
||||
this.indexBase = getCollectionAttributeMapping().getIndexMetadata().getListIndexBase();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PersistentArrayHolder getCollectionInstance() {
|
||||
return (PersistentArrayHolder) super.getCollectionInstance();
|
||||
|
@ -6,18 +6,15 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Chris Cranford
|
||||
@ -44,7 +41,6 @@ public CollectionInitializer produceInitializer(
|
||||
LockMode lockMode,
|
||||
DomainResultAssembler keyContainerAssembler,
|
||||
DomainResultAssembler keyCollectionAssembler,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
return new ArrayInitializer(
|
||||
navigablePath,
|
||||
@ -53,16 +49,8 @@ public CollectionInitializer produceInitializer(
|
||||
lockMode,
|
||||
keyContainerAssembler,
|
||||
keyCollectionAssembler,
|
||||
listIndexFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
),
|
||||
elementFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
)
|
||||
listIndexFetch.createAssembler( parentAccess, creationState ),
|
||||
elementFetch.createAssembler( parentAccess, creationState )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,8 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class BagInitializer extends AbstractImmediateCollectionInitializer {
|
||||
private static final String CONCRETE_NAME = BagInitializer.class.getSimpleName();
|
||||
|
||||
private final DomainResultAssembler elementAssembler;
|
||||
private final DomainResultAssembler collectionIdAssembler;
|
||||
|
||||
@ -43,6 +45,11 @@ public BagInitializer(
|
||||
this.collectionIdAssembler = collectionIdAssembler;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readCollectionRow(
|
||||
CollectionKey collectionKey,
|
||||
|
@ -6,19 +6,15 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -55,11 +51,9 @@ public CollectionInitializer produceInitializer(
|
||||
LockMode lockMode,
|
||||
DomainResultAssembler keyContainerAssembler,
|
||||
DomainResultAssembler keyCollectionAssembler,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
final DomainResultAssembler elementAssembler = elementFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
|
||||
@ -70,7 +64,6 @@ public CollectionInitializer produceInitializer(
|
||||
else {
|
||||
collectionIdAssembler = collectionIdFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
@ -79,28 +78,24 @@ public JavaTypeDescriptor getResultJavaTypeDescriptor() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createResultAssembler(
|
||||
Consumer initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
|
||||
final CollectionInitializer initializer = (CollectionInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
() -> {
|
||||
final DomainResultAssembler fkAssembler = fkResult.createResultAssembler( creationState );
|
||||
|
||||
final DomainResultAssembler fkAssembler = fkResult.createResultAssembler(
|
||||
initializerCollector,
|
||||
creationState
|
||||
return initializerProducer.produceInitializer(
|
||||
loadingPath,
|
||||
loadingAttribute,
|
||||
null,
|
||||
LockMode.READ,
|
||||
fkAssembler,
|
||||
fkAssembler,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
final CollectionInitializer initializer = initializerProducer.produceInitializer(
|
||||
loadingPath,
|
||||
loadingAttribute,
|
||||
null,
|
||||
LockMode.READ,
|
||||
fkAssembler,
|
||||
fkAssembler,
|
||||
initializerCollector,
|
||||
creationState
|
||||
);
|
||||
|
||||
initializerCollector.accept( initializer );
|
||||
|
||||
return new EagerCollectionAssembler( loadingAttribute, initializer );
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -22,9 +23,14 @@ public DelayedCollectionAssembler(
|
||||
NavigablePath fetchPath,
|
||||
PluralAttributeMapping fetchedMapping,
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
super( fetchedMapping, new DelayedCollectionInitializer( fetchPath, fetchedMapping, parentAccess ) );
|
||||
collector.accept( initializer );
|
||||
super(
|
||||
fetchedMapping,
|
||||
() -> (CollectionInitializer) creationState.resolveInitializer(
|
||||
fetchPath,
|
||||
() -> new DelayedCollectionInitializer( fetchPath, fetchedMapping, parentAccess )
|
||||
)
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -32,13 +32,11 @@ public DelayedCollectionFetch(
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
return new DelayedCollectionAssembler(
|
||||
getNavigablePath(),
|
||||
getFetchedMapping(),
|
||||
parentAccess,
|
||||
collector,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
|
@ -17,6 +17,6 @@ public class EagerCollectionAssembler extends AbstractCollectionAssembler {
|
||||
public EagerCollectionAssembler(
|
||||
PluralAttributeMapping fetchedMapping,
|
||||
CollectionInitializer initializer) {
|
||||
super( fetchedMapping, initializer );
|
||||
super( fetchedMapping, () -> initializer );
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,6 @@
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
@ -20,7 +19,6 @@
|
||||
import org.hibernate.sql.ast.spi.FromClauseAccess;
|
||||
import org.hibernate.sql.ast.tree.from.TableGroup;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
@ -28,7 +26,7 @@
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.FetchableContainer;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
/**
|
||||
@ -99,38 +97,31 @@ public EagerCollectionFetch(
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
final DomainResultAssembler keyContainerAssembler = keyContainerResult.createResultAssembler(
|
||||
collector,
|
||||
creationState
|
||||
);
|
||||
|
||||
final DomainResultAssembler keyCollectionAssembler;
|
||||
if ( keyCollectionResult == null ) {
|
||||
keyCollectionAssembler = null;
|
||||
}
|
||||
else {
|
||||
keyCollectionAssembler = keyCollectionResult.createResultAssembler(
|
||||
collector,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
|
||||
final CollectionInitializer initializer = initializerProducer.produceInitializer(
|
||||
public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, AssemblerCreationState creationState) {
|
||||
final CollectionInitializer initializer = (CollectionInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
getFetchedMapping(),
|
||||
parentAccess,
|
||||
null,
|
||||
keyContainerAssembler,
|
||||
keyCollectionAssembler,
|
||||
collector,
|
||||
creationState
|
||||
);
|
||||
() -> {
|
||||
final DomainResultAssembler keyContainerAssembler = keyContainerResult.createResultAssembler( creationState );
|
||||
|
||||
collector.accept( initializer );
|
||||
final DomainResultAssembler keyCollectionAssembler;
|
||||
if ( keyCollectionResult == null ) {
|
||||
keyCollectionAssembler = null;
|
||||
}
|
||||
else {
|
||||
keyCollectionAssembler = keyCollectionResult.createResultAssembler( creationState );
|
||||
}
|
||||
|
||||
return initializerProducer.produceInitializer(
|
||||
getNavigablePath(),
|
||||
getFetchedMapping(),
|
||||
parentAccess,
|
||||
null,
|
||||
keyContainerAssembler,
|
||||
keyCollectionAssembler,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
return new EagerCollectionAssembler( getFetchedMapping(), initializer );
|
||||
}
|
||||
|
@ -24,6 +24,8 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class ListInitializer extends AbstractImmediateCollectionInitializer {
|
||||
private static final String CONCRETE_NAME = ListInitializer.class.getSimpleName();
|
||||
|
||||
private final DomainResultAssembler listIndexAssembler;
|
||||
private final DomainResultAssembler elementAssembler;
|
||||
|
||||
@ -45,6 +47,11 @@ public ListInitializer(
|
||||
listIndexBase = attributeMapping.getIndexMetadata().getListIndexBase();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PersistentList getCollectionInstance() {
|
||||
return (PersistentList) super.getCollectionInstance();
|
||||
|
@ -6,18 +6,15 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -44,7 +41,6 @@ public CollectionInitializer produceInitializer(
|
||||
LockMode lockMode,
|
||||
DomainResultAssembler keyContainerAssembler,
|
||||
DomainResultAssembler keyCollectionAssembler,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
return new ListInitializer(
|
||||
navigablePath,
|
||||
@ -53,16 +49,8 @@ public CollectionInitializer produceInitializer(
|
||||
lockMode,
|
||||
keyContainerAssembler,
|
||||
keyCollectionAssembler,
|
||||
listIndexFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
),
|
||||
elementFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
)
|
||||
listIndexFetch.createAssembler( parentAccess, creationState ),
|
||||
elementFetch.createAssembler( parentAccess, creationState )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,8 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class MapInitializer extends AbstractImmediateCollectionInitializer {
|
||||
private static final String CONCRETE_NAME = MapInitializer.class.getSimpleName();
|
||||
|
||||
private final DomainResultAssembler mapKeyAssembler;
|
||||
private final DomainResultAssembler mapValueAssembler;
|
||||
|
||||
@ -44,6 +46,11 @@ public MapInitializer(
|
||||
this.mapValueAssembler = mapValueAssembler;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PersistentMap getCollectionInstance() {
|
||||
return (PersistentMap) super.getCollectionInstance();
|
||||
|
@ -6,18 +6,15 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -44,17 +41,14 @@ public CollectionInitializer produceInitializer(
|
||||
LockMode lockMode,
|
||||
DomainResultAssembler keyContainerAssembler,
|
||||
DomainResultAssembler keyCollectionAssembler,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
final DomainResultAssembler mapKeyAssembler = mapKeyFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
|
||||
final DomainResultAssembler mapValueAssembler = mapValueFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
|
||||
|
@ -6,13 +6,11 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Andrea Boriero
|
||||
@ -23,9 +21,13 @@ public SelectEagerCollectionAssembler(
|
||||
NavigablePath fetchPath,
|
||||
PluralAttributeMapping fetchedMapping,
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
super( fetchedMapping, new SelectEagerCollectionInitializer( fetchPath, fetchedMapping, parentAccess ) );
|
||||
collector.accept( initializer );
|
||||
super(
|
||||
fetchedMapping,
|
||||
() -> (CollectionInitializer) creationState.resolveInitializer(
|
||||
fetchPath,
|
||||
() -> new SelectEagerCollectionInitializer( fetchPath, fetchedMapping, parentAccess )
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -41,12 +41,12 @@ public boolean hasTableGroup() {
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess, Consumer<Initializer> collector, AssemblerCreationState creationState) {
|
||||
FetchParentAccess parentAccess,
|
||||
AssemblerCreationState creationState) {
|
||||
return new SelectEagerCollectionAssembler(
|
||||
getNavigablePath(),
|
||||
getFetchedMapping(),
|
||||
parentAccess,
|
||||
collector,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
|
@ -22,6 +22,8 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class SetInitializer extends AbstractImmediateCollectionInitializer {
|
||||
private static final String CONCRETE_NAME = SetInitializer.class.getSimpleName();
|
||||
|
||||
private final DomainResultAssembler elementAssembler;
|
||||
|
||||
public SetInitializer(
|
||||
@ -36,6 +38,11 @@ public SetInitializer(
|
||||
this.elementAssembler = elementAssembler;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PersistentSet getCollectionInstance() {
|
||||
return (PersistentSet) super.getCollectionInstance();
|
||||
|
@ -6,18 +6,15 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.collection.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.collection.spi.CollectionInitializerProducer;
|
||||
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.collection.CollectionInitializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -41,13 +38,8 @@ public CollectionInitializer produceInitializer(
|
||||
LockMode lockMode,
|
||||
DomainResultAssembler keyContainerAssembler,
|
||||
DomainResultAssembler keyCollectionAssembler,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
final DomainResultAssembler elementAssembler = elementFetch.createAssembler(
|
||||
parentAccess,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
final DomainResultAssembler elementAssembler = elementFetch.createAssembler( parentAccess, creationState );
|
||||
|
||||
return new SetInitializer(
|
||||
navigablePath,
|
||||
|
@ -8,10 +8,10 @@
|
||||
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
|
||||
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
|
||||
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
|
||||
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
|
||||
import org.hibernate.metamodel.mapping.StateArrayContributorMapping;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
@ -20,7 +20,6 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.internal.NullValueAssembler;
|
||||
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
|
||||
|
||||
@ -44,7 +43,6 @@ public abstract class AbstractEmbeddableInitializer extends AbstractFetchParentA
|
||||
public AbstractEmbeddableInitializer(
|
||||
EmbeddableResultGraphNode resultDescriptor,
|
||||
FetchParentAccess fetchParentAccess,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
this.navigablePath = resultDescriptor.getNavigablePath();
|
||||
this.embeddedModelPartDescriptor = resultDescriptor.getReferencedMappingContainer();
|
||||
@ -61,7 +59,7 @@ public AbstractEmbeddableInitializer(
|
||||
|
||||
final DomainResultAssembler stateAssembler = fetch == null
|
||||
? new NullValueAssembler( stateArrayContributor.getJavaTypeDescriptor() )
|
||||
: fetch.createAssembler( this, initializerConsumer, creationState );
|
||||
: fetch.createAssembler( this, creationState );
|
||||
|
||||
assemblerMap.put( stateArrayContributor, stateAssembler );
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.embeddable;
|
||||
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
import org.hibernate.sql.results.LoadingLogger;
|
||||
|
||||
import org.jboss.logging.BasicLogger;
|
||||
import org.jboss.logging.Logger;
|
||||
@ -19,17 +19,16 @@
|
||||
@MessageLogger( projectCode = "HHH" )
|
||||
@ValidIdRange( min = 90005301, max = 90005400 )
|
||||
public interface EmbeddableLoadingLogger extends BasicLogger {
|
||||
String LOGGER_NAME = ResultsLogger.LOGGER_NAME + "loading.composite";
|
||||
String LOCAL_NAME = "composite";
|
||||
|
||||
String LOGGER_NAME = LoadingLogger.subLoggerName( LOCAL_NAME );
|
||||
|
||||
/**
|
||||
* Static access to the logging instance
|
||||
*/
|
||||
EmbeddableLoadingLogger INSTANCE = Logger.getMessageLogger(
|
||||
EmbeddableLoadingLogger.class,
|
||||
LOGGER_NAME
|
||||
);
|
||||
Logger INSTANCE = LoadingLogger.subLogger( LOCAL_NAME );
|
||||
|
||||
|
||||
boolean TRACE_ENABLED = INSTANCE.isTraceEnabled();
|
||||
boolean DEBUG_ENABLED = INSTANCE.isDebugEnabled();
|
||||
boolean INFO_ENABLED = INSTANCE.isInfoEnabled();
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.embeddable.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
|
||||
@ -24,7 +22,7 @@
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Fetchable;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableValuedFetchable;
|
||||
|
||||
@ -64,9 +62,7 @@ public EmbeddableFetchImpl(
|
||||
null,
|
||||
nullable ? SqlAstJoinType.LEFT : SqlAstJoinType.INNER,
|
||||
LockMode.NONE,
|
||||
stem -> creationState.getSqlAliasBaseManager().createSqlAliasBase( stem ),
|
||||
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
|
||||
creationState.getSqlAstCreationState().getCreationContext()
|
||||
creationState.getSqlAstCreationState()
|
||||
);
|
||||
return tableGroupJoin.getJoinedGroup();
|
||||
}
|
||||
@ -114,18 +110,16 @@ public EmbeddableMappingType getReferencedMappingType() {
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
final EmbeddableFetchInitializer initializer = new EmbeddableFetchInitializer(
|
||||
parentAccess,
|
||||
this,
|
||||
collector,
|
||||
creationState
|
||||
final EmbeddableInitializer initializer = (EmbeddableInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
() -> new EmbeddableFetchInitializer(
|
||||
parentAccess,
|
||||
this,
|
||||
creationState
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
collector.accept( initializer );
|
||||
|
||||
return new EmbeddableAssembler( initializer );
|
||||
}
|
||||
}
|
||||
|
@ -6,14 +6,11 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.embeddable.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -24,9 +21,8 @@ public class EmbeddableFetchInitializer
|
||||
public EmbeddableFetchInitializer(
|
||||
FetchParentAccess fetchParentAccess,
|
||||
EmbeddableResultGraphNode resultDescriptor,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
super( resultDescriptor, fetchParentAccess, initializerConsumer, creationState );
|
||||
super( resultDescriptor, fetchParentAccess, creationState );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.internal.util.MutableInteger;
|
||||
@ -26,9 +25,9 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.Fetchable;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.basic.BasicFetch;
|
||||
import org.hibernate.sql.results.graph.basic.BasicResult;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.entity.internal.EntityFetchDelayedImpl;
|
||||
import org.hibernate.sql.results.graph.entity.internal.EntityFetchSelectImpl;
|
||||
@ -36,7 +35,8 @@
|
||||
/**
|
||||
* @author Andrea Boriero
|
||||
*/
|
||||
public class EmbeddableForeignKeyResultImpl<T> extends AbstractFetchParent
|
||||
public class EmbeddableForeignKeyResultImpl<T>
|
||||
extends AbstractFetchParent
|
||||
implements EmbeddableResultGraphNode, DomainResult<T> {
|
||||
|
||||
private final String resultVariable;
|
||||
@ -119,16 +119,12 @@ public String getResultVariable() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler<T> createResultAssembler(
|
||||
Consumer<Initializer> initializerCollector, AssemblerCreationState creationState) {
|
||||
final EmbeddableResultInitializer initializer = new EmbeddableResultInitializer(
|
||||
this,
|
||||
initializerCollector,
|
||||
creationState
|
||||
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
|
||||
final EmbeddableInitializer initializer = (EmbeddableInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
() -> new EmbeddableResultInitializer(this, creationState )
|
||||
);
|
||||
|
||||
initializerCollector.accept( initializer );
|
||||
|
||||
//noinspection unchecked
|
||||
return new EmbeddableAssembler( initializer );
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.embeddable.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.metamodel.mapping.EmbeddableMappingType;
|
||||
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
|
||||
@ -17,11 +15,11 @@
|
||||
import org.hibernate.sql.ast.tree.from.TableGroupJoin;
|
||||
import org.hibernate.sql.results.graph.AbstractFetchParent;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
/**
|
||||
@ -50,9 +48,7 @@ public EmbeddableResultImpl(
|
||||
resultVariable,
|
||||
SqlAstJoinType.INNER,
|
||||
LockMode.NONE,
|
||||
creationState.getSqlAstCreationState().getSqlAliasBaseGenerator(),
|
||||
creationState.getSqlAstCreationState().getSqlExpressionResolver(),
|
||||
creationState.getSqlAstCreationState().getCreationContext()
|
||||
creationState.getSqlAstCreationState()
|
||||
);
|
||||
|
||||
return tableGroupJoin.getJoinedGroup();
|
||||
@ -88,17 +84,15 @@ public EmbeddableValuedModelPart getReferencedMappingContainer() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler<T> createResultAssembler(
|
||||
Consumer<Initializer> initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
final EmbeddableResultInitializer initializer = new EmbeddableResultInitializer(
|
||||
this,
|
||||
initializerCollector,
|
||||
creationState
|
||||
public DomainResultAssembler<T> createResultAssembler(AssemblerCreationState creationState) {
|
||||
final EmbeddableInitializer initializer = (EmbeddableInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
() -> new EmbeddableResultInitializer(
|
||||
this,
|
||||
creationState
|
||||
)
|
||||
);
|
||||
|
||||
initializerCollector.accept( initializer );
|
||||
|
||||
//noinspection unchecked
|
||||
return new EmbeddableAssembler( initializer );
|
||||
}
|
||||
|
@ -6,12 +6,9 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.embeddable.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.embeddable.AbstractEmbeddableInitializer;
|
||||
import org.hibernate.sql.results.graph.embeddable.EmbeddableResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
@ -19,13 +16,17 @@
|
||||
public class EmbeddableResultInitializer extends AbstractEmbeddableInitializer {
|
||||
public EmbeddableResultInitializer(
|
||||
EmbeddableResultGraphNode resultDescriptor,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
super( resultDescriptor, null, initializerConsumer, creationState );
|
||||
super( resultDescriptor, null, creationState );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getParentKey() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "EmbeddableResultInitializer(" + getNavigablePath() + ")";
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.WrongClassException;
|
||||
@ -38,13 +38,14 @@
|
||||
import org.hibernate.persister.entity.Loadable;
|
||||
import org.hibernate.proxy.HibernateProxy;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.internal.NullValueAssembler;
|
||||
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||
import org.hibernate.sql.results.graph.AbstractFetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Fetch;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.internal.NullValueAssembler;
|
||||
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
|
||||
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
|
||||
import org.hibernate.type.TypeHelper;
|
||||
@ -56,10 +57,10 @@
|
||||
*/
|
||||
public abstract class AbstractEntityInitializer extends AbstractFetchParentAccess implements EntityInitializer {
|
||||
|
||||
// NOTE : even though we only keep the EntityDescriptor here, rather than EntityReference
|
||||
// NOTE : even though we only keep the EntityDescriptor here, rather than EntityResultGraphNode
|
||||
// the "scope" of this initializer is a specific EntityReference.
|
||||
//
|
||||
// The full EntityReference is simply not needed here, and so we just keep
|
||||
// The full EntityResultGraphNode is simply not needed here, and so we just keep
|
||||
// the EntityDescriptor here to avoid chicken/egg issues in the creation of
|
||||
// these
|
||||
|
||||
@ -93,7 +94,6 @@ protected AbstractEntityInitializer(
|
||||
DomainResult<?> identifierResult,
|
||||
DomainResult<?> discriminatorResult,
|
||||
DomainResult<?> versionResult,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
super( );
|
||||
|
||||
@ -112,8 +112,38 @@ protected AbstractEntityInitializer(
|
||||
|
||||
if ( identifierResult != null ) {
|
||||
this.identifierAssembler = identifierResult.createResultAssembler(
|
||||
identifierInitializers::add,
|
||||
creationState
|
||||
new AssemblerCreationState() {
|
||||
@Override
|
||||
public Initializer resolveInitializer(NavigablePath navigablePath, Supplier<Initializer> producer) {
|
||||
for ( int i = 0; i < identifierInitializers.size(); i++ ) {
|
||||
final Initializer existing = identifierInitializers.get( i );
|
||||
if ( existing.getNavigablePath().equals( navigablePath ) ) {
|
||||
identifierInitializers.add( existing );
|
||||
return existing;
|
||||
}
|
||||
}
|
||||
|
||||
// // also check the non-identifier initializers
|
||||
// final Initializer otherExisting = creationState.resolveInitializer(
|
||||
// navigablePath,
|
||||
// () -> null
|
||||
// );
|
||||
//
|
||||
// if ( otherExisting != null ) {
|
||||
// identifierInitializers.add( otherExisting );
|
||||
// return otherExisting;
|
||||
// }
|
||||
|
||||
final Initializer initializer = producer.get();
|
||||
identifierInitializers.add( initializer );
|
||||
return initializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SqlAstCreationContext getSqlAstCreationContext() {
|
||||
return creationState.getSqlAstCreationContext();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
else {
|
||||
@ -121,26 +151,14 @@ protected AbstractEntityInitializer(
|
||||
}
|
||||
|
||||
if ( discriminatorResult != null ) {
|
||||
discriminatorAssembler = discriminatorResult.createResultAssembler(
|
||||
initializer -> {
|
||||
throw new UnsupportedOperationException(
|
||||
"Registering an Initializer as part of Entity discriminator is illegal" );
|
||||
},
|
||||
creationState
|
||||
);
|
||||
discriminatorAssembler = discriminatorResult.createResultAssembler( creationState );
|
||||
}
|
||||
else {
|
||||
discriminatorAssembler = null;
|
||||
}
|
||||
|
||||
if ( versionResult != null ) {
|
||||
this.versionAssembler = versionResult.createResultAssembler(
|
||||
initializer -> {
|
||||
throw new UnsupportedOperationException(
|
||||
"Registering an Initializer as part of Entity version is illegal" );
|
||||
},
|
||||
creationState
|
||||
);
|
||||
this.versionAssembler = versionResult.createResultAssembler( creationState );
|
||||
}
|
||||
else {
|
||||
this.versionAssembler = null;
|
||||
@ -163,21 +181,17 @@ protected AbstractEntityInitializer(
|
||||
stateAssembler = new NullValueAssembler( attributeMapping.getMappedTypeDescriptor().getMappedJavaTypeDescriptor() );
|
||||
}
|
||||
else {
|
||||
stateAssembler = fetch.createAssembler(
|
||||
this,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
stateAssembler = fetch.createAssembler( this, creationState );
|
||||
}
|
||||
|
||||
assemblerMap.put( attributeMapping, stateAssembler );
|
||||
},
|
||||
null
|
||||
);
|
||||
|
||||
initializerConsumer.accept( this );
|
||||
}
|
||||
|
||||
protected abstract String getSimpleConcreteImplName();
|
||||
|
||||
public NavigablePath getNavigablePath() {
|
||||
return navigablePath;
|
||||
}
|
||||
@ -234,7 +248,7 @@ public void resolveKey(RowProcessingState rowProcessingState) {
|
||||
}
|
||||
|
||||
if ( EntityLoadingLogger.TRACE_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.tracef(
|
||||
EntityLoadingLogger.LOGGER.tracef(
|
||||
"(%s) Beginning Initializer#resolveKey process for entity : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getNavigablePath().getFullPath()
|
||||
@ -248,9 +262,9 @@ public void resolveKey(RowProcessingState rowProcessingState) {
|
||||
resolveEntityKey( rowProcessingState );
|
||||
|
||||
if ( entityKey == null ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%s) EntityKey (%s) is null",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
getNavigablePath()
|
||||
);
|
||||
|
||||
@ -260,9 +274,9 @@ public void resolveKey(RowProcessingState rowProcessingState) {
|
||||
}
|
||||
|
||||
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%s) Hydrated EntityKey (%s): %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
getNavigablePath(),
|
||||
entityKey.getIdentifier()
|
||||
);
|
||||
@ -355,7 +369,7 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
final Object entityIdentifier = entityKey.getIdentifier();
|
||||
|
||||
if ( EntityLoadingLogger.TRACE_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.tracef(
|
||||
EntityLoadingLogger.LOGGER.tracef(
|
||||
"(%s) Beginning Initializer#resolveInstance process for entity (%s) : %s",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getNavigablePath(),
|
||||
@ -385,9 +399,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
|
||||
if ( existingLoadingEntry != null ) {
|
||||
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%s) Found existing loading entry [%s] - using loading instance",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
toLoggableString( getNavigablePath(), entityIdentifier )
|
||||
);
|
||||
}
|
||||
@ -397,9 +411,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
if ( existingLoadingEntry.getEntityInitializer() != this ) {
|
||||
// the entity is already being loaded elsewhere
|
||||
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%s) Entity [%s] being loaded by another initializer [%s] - skipping processing",
|
||||
StringHelper.collapse( this.getClass().getName() ),
|
||||
getSimpleConcreteImplName(),
|
||||
toLoggableString( getNavigablePath(), entityIdentifier ),
|
||||
existingLoadingEntry.getEntityInitializer()
|
||||
);
|
||||
@ -433,8 +447,9 @@ public void resolveInstance(RowProcessingState rowProcessingState) {
|
||||
entityInstance = session.instantiate( concreteDescriptor.getEntityName(), entityKey.getIdentifier() );
|
||||
|
||||
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
"Created new entity instance [%s] : %s",
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%s) Created new entity instance [%s] : %s",
|
||||
getSimpleConcreteImplName(),
|
||||
toLoggableString( getNavigablePath(), entityIdentifier ),
|
||||
entityInstance
|
||||
);
|
||||
@ -475,8 +490,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
|
||||
final Serializable entityIdentifier = entityKey.getIdentifier();
|
||||
|
||||
if ( EntityLoadingLogger.TRACE_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.tracef(
|
||||
"Beginning Initializer#initializeInstance process for entity %s",
|
||||
EntityLoadingLogger.LOGGER.tracef(
|
||||
"(%s) Beginning Initializer#initializeInstance process for entity %s",
|
||||
getSimpleConcreteImplName(),
|
||||
toLoggableString( getNavigablePath(), entityIdentifier )
|
||||
);
|
||||
}
|
||||
@ -549,8 +565,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
|
||||
if ( cacheAccess != null && session.getCacheMode().isPutEnabled() ) {
|
||||
|
||||
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
"Adding entityInstance to second-level cache: %s",
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%S) Adding entityInstance to second-level cache: %s",
|
||||
getSimpleConcreteImplName(),
|
||||
toLoggableString( getNavigablePath(), entityIdentifier )
|
||||
);
|
||||
}
|
||||
@ -605,8 +622,8 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
|
||||
persistenceContext.getNaturalIdHelper().cacheNaturalIdCrossReferenceFromLoad(
|
||||
entityDescriptor,
|
||||
entityIdentifier,
|
||||
persistenceContext
|
||||
.getNaturalIdHelper().extractNaturalIdValues( resolvedEntityState, entityDescriptor )
|
||||
persistenceContext.getNaturalIdHelper()
|
||||
.extractNaturalIdValues( resolvedEntityState, entityDescriptor )
|
||||
);
|
||||
}
|
||||
|
||||
@ -643,8 +660,9 @@ public void initializeInstance(RowProcessingState rowProcessingState) {
|
||||
concreteDescriptor.afterInitialize( entityInstance, session );
|
||||
|
||||
if ( EntityLoadingLogger.DEBUG_ENABLED ) {
|
||||
EntityLoadingLogger.INSTANCE.debugf(
|
||||
"Done materializing entityInstance : %s",
|
||||
EntityLoadingLogger.LOGGER.debugf(
|
||||
"(%s) Done materializing entityInstance : %s",
|
||||
getSimpleConcreteImplName(),
|
||||
toLoggableString( getNavigablePath(), entityIdentifier )
|
||||
);
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
@ -17,7 +15,6 @@
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Fetchable;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.entity.internal.EntityAssembler;
|
||||
|
||||
/**
|
||||
@ -64,19 +61,13 @@ public Fetchable getFetchedMapping() {
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
final EntityInitializer entityInitializer = getEntityInitializer(
|
||||
parentAccess,
|
||||
collector,
|
||||
creationState
|
||||
);
|
||||
final EntityInitializer entityInitializer = getEntityInitializer( parentAccess, creationState );
|
||||
return new EntityAssembler( getFetchedMapping().getJavaTypeDescriptor(), entityInitializer );
|
||||
}
|
||||
|
||||
protected abstract EntityInitializer getEntityInitializer(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState);
|
||||
|
||||
@Override
|
||||
|
@ -6,30 +6,21 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity;
|
||||
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
import org.hibernate.sql.results.LoadingLogger;
|
||||
|
||||
import org.jboss.logging.BasicLogger;
|
||||
import org.jboss.logging.Logger;
|
||||
import org.jboss.logging.annotations.MessageLogger;
|
||||
import org.jboss.logging.annotations.ValidIdRange;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
@MessageLogger( projectCode = "HHH" )
|
||||
@ValidIdRange( min = 90005201, max = 90005300 )
|
||||
public interface EntityLoadingLogger extends BasicLogger {
|
||||
String LOGGER_NAME = ResultsLogger.LOGGER_NAME + "loading.entity";
|
||||
public interface EntityLoadingLogger {
|
||||
String LOGGER_NAME = LoadingLogger.subLoggerName( "entity" );
|
||||
|
||||
/**
|
||||
* Static access to the logging instance
|
||||
*/
|
||||
EntityLoadingLogger INSTANCE = Logger.getMessageLogger(
|
||||
EntityLoadingLogger.class,
|
||||
LOGGER_NAME
|
||||
);
|
||||
Logger LOGGER = LoadingLogger.subLogger( "entity" );
|
||||
|
||||
boolean TRACE_ENABLED = INSTANCE.isTraceEnabled();
|
||||
boolean DEBUG_ENABLED = INSTANCE.isDebugEnabled();
|
||||
boolean INFO_ENABLED = INSTANCE.isInfoEnabled();
|
||||
boolean TRACE_ENABLED = LOGGER.isTraceEnabled();
|
||||
boolean DEBUG_ENABLED = LOGGER.isDebugEnabled();
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
public class EntityAssembler implements DomainResultAssembler {
|
||||
private final JavaTypeDescriptor javaTypeDescriptor;
|
||||
private final EntityInitializer initializer;
|
||||
private EntityInitializer replacedInitializer;
|
||||
|
||||
public EntityAssembler(
|
||||
JavaTypeDescriptor javaTypeDescriptor,
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.metamodel.mapping.internal.SingularAssociationAttributeMapping;
|
||||
@ -17,7 +15,6 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||
|
||||
/**
|
||||
@ -57,14 +54,16 @@ public boolean hasTableGroup() {
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
final EntityInitializer entityInitializer = new EntityFetchDelayedInitializer(
|
||||
final EntityInitializer entityInitializer = (EntityInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
getEntityValuedModelPart().getEntityMappingType().getEntityPersister(),
|
||||
keyResult.createResultAssembler( collector, creationState )
|
||||
() -> new EntityFetchDelayedInitializer(
|
||||
getNavigablePath(),
|
||||
getEntityValuedModelPart().getEntityMappingType().getEntityPersister(),
|
||||
keyResult.createResultAssembler( creationState )
|
||||
)
|
||||
);
|
||||
collector.accept( entityInitializer );
|
||||
|
||||
return new EntityAssembler( getFetchedMapping().getJavaTypeDescriptor(), entityInitializer );
|
||||
}
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
@ -15,7 +13,6 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.entity.AbstractNonLazyEntityFetch;
|
||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityValuedFetchable;
|
||||
@ -49,17 +46,18 @@ public EntityFetchJoinedImpl(
|
||||
@Override
|
||||
protected EntityInitializer getEntityInitializer(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
return new EntityJoinedFetchInitializer(
|
||||
entityResult,
|
||||
return (EntityInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
lockMode,
|
||||
entityResult.getIdentifierResult(),
|
||||
entityResult.getDiscriminatorResult(),
|
||||
entityResult.getVersionResult(),
|
||||
collector,
|
||||
creationState
|
||||
() -> new EntityJoinedFetchInitializer(
|
||||
entityResult,
|
||||
getNavigablePath(),
|
||||
lockMode,
|
||||
entityResult.getIdentifierResult(),
|
||||
entityResult.getDiscriminatorResult(),
|
||||
entityResult.getVersionResult(),
|
||||
creationState
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.metamodel.mapping.internal.SingularAssociationAttributeMapping;
|
||||
@ -18,7 +16,7 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchParent;
|
||||
import org.hibernate.sql.results.graph.FetchParentAccess;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||
|
||||
/**
|
||||
* An eager entity fetch performed as a subsequent (n+1) select
|
||||
@ -53,22 +51,17 @@ public boolean hasTableGroup() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
final EntitySelectFetchInitializer initializer = new EntitySelectFetchInitializer(
|
||||
public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, AssemblerCreationState creationState) {
|
||||
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
getReferencedMappingContainer().getEntityPersister(),
|
||||
result.createResultAssembler( collector, creationState ),
|
||||
nullable
|
||||
() -> new EntitySelectFetchInitializer(
|
||||
getNavigablePath(),
|
||||
getReferencedMappingContainer().getEntityPersister(),
|
||||
result.createResultAssembler( creationState ),
|
||||
nullable
|
||||
)
|
||||
);
|
||||
|
||||
collector.accept( initializer );
|
||||
|
||||
return new EntityAssembler(
|
||||
getResultJavaTypeDescriptor(),
|
||||
initializer
|
||||
);
|
||||
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );
|
||||
}
|
||||
}
|
||||
|
@ -6,21 +6,19 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.internal.log.LoggingHelper;
|
||||
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
|
||||
/**
|
||||
* @author Andrea Boriero
|
||||
*/
|
||||
public class EntityJoinedFetchInitializer extends AbstractEntityInitializer {
|
||||
private static final String CONCRETE_NAME = EntityJoinedFetchInitializer.class.getSimpleName();
|
||||
|
||||
protected EntityJoinedFetchInitializer(
|
||||
EntityResultGraphNode resultDescriptor,
|
||||
@ -29,7 +27,6 @@ protected EntityJoinedFetchInitializer(
|
||||
DomainResult<?> identifierResult,
|
||||
DomainResult<?> discriminatorResult,
|
||||
DomainResult<?> versionResult,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
super(
|
||||
resultDescriptor,
|
||||
@ -38,11 +35,15 @@ protected EntityJoinedFetchInitializer(
|
||||
identifierResult,
|
||||
discriminatorResult,
|
||||
versionResult,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isEntityReturn() {
|
||||
return false;
|
||||
@ -50,6 +51,6 @@ protected boolean isEntityReturn() {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "EntityFetchInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
|
||||
return "EntityJoinedFetchInitializer(" + LoggingHelper.toLoggableString( getNavigablePath() ) + ")";
|
||||
}
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
@ -16,6 +14,7 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchableContainer;
|
||||
import org.hibernate.sql.results.graph.entity.AbstractEntityResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityResult;
|
||||
|
||||
/**
|
||||
@ -68,20 +67,18 @@ public String getResultVariable() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createResultAssembler(
|
||||
Consumer initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
// todo (6.0) : seems like here is where we ought to determine the SQL selection mappings
|
||||
|
||||
final EntityResultInitializer initializer = new EntityResultInitializer(
|
||||
this,
|
||||
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
|
||||
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
getLockMode(),
|
||||
getIdentifierResult(),
|
||||
getDiscriminatorResult(),
|
||||
getVersionResult(),
|
||||
initializerCollector,
|
||||
creationState
|
||||
() -> new EntityResultInitializer(
|
||||
this,
|
||||
getNavigablePath(),
|
||||
getLockMode(),
|
||||
getIdentifierResult(),
|
||||
getDiscriminatorResult(),
|
||||
getVersionResult(),
|
||||
creationState
|
||||
)
|
||||
);
|
||||
|
||||
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );
|
||||
|
@ -6,15 +6,13 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.collection.internal.MapInitializer;
|
||||
import org.hibernate.sql.results.graph.entity.AbstractEntityInitializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
|
||||
/**
|
||||
* Initializer for cases where the entity is a root domain selection
|
||||
@ -22,6 +20,8 @@
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class EntityResultInitializer extends AbstractEntityInitializer {
|
||||
private static final String CONCRETE_NAME = EntityResultInitializer.class.getSimpleName();
|
||||
|
||||
public EntityResultInitializer(
|
||||
EntityResultGraphNode resultDescriptor,
|
||||
NavigablePath navigablePath,
|
||||
@ -29,7 +29,6 @@ public EntityResultInitializer(
|
||||
DomainResult identifierResult,
|
||||
DomainResult discriminatorResult,
|
||||
DomainResult versionResult,
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
super(
|
||||
resultDescriptor,
|
||||
@ -38,11 +37,15 @@ public EntityResultInitializer(
|
||||
identifierResult,
|
||||
discriminatorResult,
|
||||
versionResult,
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getSimpleConcreteImplName() {
|
||||
return CONCRETE_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isEntityReturn() {
|
||||
return true;
|
||||
|
@ -6,8 +6,6 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.entity.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
|
||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
|
||||
@ -17,6 +15,7 @@
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||
|
||||
/**
|
||||
* @author Andrea Boriero
|
||||
@ -31,20 +30,18 @@ public EntityResultJoinedSubclassImpl(
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createResultAssembler(
|
||||
Consumer initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
// todo (6.0) : seems like here is where we ought to determine the SQL selection mappings
|
||||
|
||||
final EntityResultInitializer initializer = new EntityResultInitializer(
|
||||
this,
|
||||
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
|
||||
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
getLockMode(),
|
||||
getIdentifierResult(),
|
||||
getDiscriminatorResult(),
|
||||
getVersionResult(),
|
||||
initializerCollector,
|
||||
creationState
|
||||
() -> new EntityResultInitializer(
|
||||
this,
|
||||
getNavigablePath(),
|
||||
getLockMode(),
|
||||
getIdentifierResult(),
|
||||
getDiscriminatorResult(),
|
||||
getVersionResult(),
|
||||
creationState
|
||||
)
|
||||
);
|
||||
|
||||
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );
|
||||
|
@ -26,6 +26,8 @@
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||
import org.hibernate.sql.results.graph.FetchableContainer;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityInitializer;
|
||||
import org.hibernate.sql.results.graph.entity.EntityResult;
|
||||
import org.hibernate.sql.results.graph.entity.EntityResultGraphNode;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
@ -186,20 +188,20 @@ public String getResultVariable() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler createResultAssembler(
|
||||
Consumer initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
public DomainResultAssembler createResultAssembler(AssemblerCreationState creationState) {
|
||||
// todo (6.0) : seems like here is where we ought to determine the SQL selection mappings
|
||||
|
||||
final EntityResultInitializer initializer = new EntityResultInitializer(
|
||||
this,
|
||||
final EntityInitializer initializer = (EntityInitializer) creationState.resolveInitializer(
|
||||
getNavigablePath(),
|
||||
getLockMode(),
|
||||
null,
|
||||
getDiscriminatorResult(),
|
||||
getVersionResult(),
|
||||
initializerCollector,
|
||||
creationState
|
||||
() -> new EntityResultInitializer(
|
||||
this,
|
||||
getNavigablePath(),
|
||||
getLockMode(),
|
||||
null,
|
||||
getDiscriminatorResult(),
|
||||
getVersionResult(),
|
||||
creationState
|
||||
)
|
||||
);
|
||||
|
||||
return new EntityAssembler( getResultJavaTypeDescriptor(), initializer );
|
||||
|
@ -6,11 +6,8 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.graph.instantiation.internal;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
/**
|
||||
@ -35,11 +32,10 @@ public JavaTypeDescriptor getResultJavaTypeDescriptor() {
|
||||
|
||||
@Override
|
||||
public ArgumentReader<A> createResultAssembler(
|
||||
Consumer<Initializer> initializerCollector,
|
||||
AssemblerCreationState creationState) {
|
||||
//noinspection unchecked
|
||||
return new ArgumentReader(
|
||||
realDomainResult.createResultAssembler( initializerCollector, creationState ),
|
||||
realDomainResult.createResultAssembler( creationState ),
|
||||
getResultVariable()
|
||||
);
|
||||
}
|
||||
|
@ -11,7 +11,6 @@
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.internal.util.StringHelper;
|
||||
import org.hibernate.query.DynamicInstantiationNature;
|
||||
@ -19,7 +18,6 @@
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.instantiation.DynamicInstantiationResult;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
|
||||
import org.jboss.logging.Logger;
|
||||
@ -58,9 +56,7 @@ public String getResultVariable() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResultAssembler<R> createResultAssembler(
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
public DomainResultAssembler<R> createResultAssembler(AssemblerCreationState creationState) {
|
||||
boolean areAllArgumentsAliased = true;
|
||||
boolean areAnyArgumentsAliased = false;
|
||||
final Set<String> aliases = new HashSet<>();
|
||||
@ -84,7 +80,7 @@ public DomainResultAssembler<R> createResultAssembler(
|
||||
}
|
||||
|
||||
argumentReaders.add(
|
||||
argumentResult.createResultAssembler( initializerConsumer, creationState )
|
||||
argumentResult.createResultAssembler( creationState )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ public void load(Consumer<List> loadingEntryConsumer) {
|
||||
final PersistenceContext persistenceContext = session.getPersistenceContext();
|
||||
final CollectionPersister collectionDescriptor = getCollectionDescriptor();
|
||||
|
||||
Helper.finalizeCollectionLoading( persistenceContext, collectionDescriptor, collectionInstance, getKey() );
|
||||
ResultsHelper.finalizeCollectionLoading( persistenceContext, collectionDescriptor, collectionInstance, getKey() );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -7,8 +7,10 @@
|
||||
package org.hibernate.sql.results.internal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.hibernate.collection.spi.PersistentCollection;
|
||||
import org.hibernate.engine.spi.BatchFetchQueue;
|
||||
@ -16,8 +18,11 @@
|
||||
import org.hibernate.engine.spi.PersistenceContext;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.persister.collection.CollectionPersister;
|
||||
import org.hibernate.query.NavigablePath;
|
||||
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||
import org.hibernate.sql.exec.spi.Callback;
|
||||
import org.hibernate.sql.results.ResultsLogger;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.jdbc.spi.JdbcValues;
|
||||
@ -27,17 +32,48 @@
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class Helper {
|
||||
public class ResultsHelper {
|
||||
public static <R> RowReader<R> createRowReader(
|
||||
SessionFactoryImplementor sessionFactory,
|
||||
Callback callback,
|
||||
RowTransformer<R> rowTransformer,
|
||||
JdbcValues jdbcValues) {
|
||||
final Map<NavigablePath,Initializer> initializerMap = new LinkedHashMap<>();
|
||||
final List<Initializer> initializers = new ArrayList<>();
|
||||
|
||||
//noinspection rawtypes
|
||||
final List<DomainResultAssembler> assemblers = jdbcValues.getValuesMapping().resolveAssemblers(
|
||||
getInitializerConsumer( initializers ),
|
||||
() -> sessionFactory
|
||||
new AssemblerCreationState() {
|
||||
@Override
|
||||
public Initializer resolveInitializer(
|
||||
NavigablePath navigablePath,
|
||||
Supplier<Initializer> producer) {
|
||||
final Initializer existing = initializerMap.get( navigablePath );
|
||||
if ( existing != null ) {
|
||||
ResultsLogger.LOGGER.debugf(
|
||||
"Returning previously-registered initializer : %s",
|
||||
existing
|
||||
);
|
||||
return existing;
|
||||
}
|
||||
|
||||
final Initializer initializer = producer.get();
|
||||
ResultsLogger.LOGGER.debugf(
|
||||
"Registering initializer : %s",
|
||||
initializer
|
||||
);
|
||||
|
||||
initializerMap.put( navigablePath, initializer );
|
||||
initializers.add( initializer );
|
||||
|
||||
return initializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SqlAstCreationContext getSqlAstCreationContext() {
|
||||
return sessionFactory;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
return new StandardRowReader<>(
|
||||
@ -48,18 +84,6 @@ public static <R> RowReader<R> createRowReader(
|
||||
);
|
||||
}
|
||||
|
||||
private static Consumer<Initializer> getInitializerConsumer(List<Initializer> initializers) {
|
||||
return initializer -> {
|
||||
ResultsLogger.LOGGER.debugf( "Initializer registration : %s", initializer );
|
||||
if ( initializers.contains( initializer ) ) {
|
||||
ResultsLogger.LOGGER.debug( "Skipping initializer registration - already registered" );
|
||||
}
|
||||
|
||||
ResultsLogger.LOGGER.debugf( "Adding initializer : %s", initializer );
|
||||
initializers.add( initializer );
|
||||
};
|
||||
}
|
||||
|
||||
public static void finalizeCollectionLoading(
|
||||
PersistenceContext persistenceContext,
|
||||
CollectionPersister collectionDescriptor,
|
@ -6,10 +6,7 @@
|
||||
*/
|
||||
package org.hibernate.sql.results.internal.domain;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.LockMode;
|
||||
import org.hibernate.NotYetImplementedFor6Exception;
|
||||
import org.hibernate.engine.FetchStrategy;
|
||||
import org.hibernate.engine.FetchTiming;
|
||||
import org.hibernate.engine.spi.CollectionKey;
|
||||
@ -91,7 +88,6 @@ public JavaTypeDescriptor getResultJavaTypeDescriptor() {
|
||||
@Override
|
||||
public DomainResultAssembler createAssembler(
|
||||
FetchParentAccess parentAccess,
|
||||
Consumer<Initializer> collector,
|
||||
AssemblerCreationState creationState) {
|
||||
return new CircularFetchAssembler(
|
||||
fetchable,
|
||||
|
@ -7,14 +7,12 @@
|
||||
package org.hibernate.sql.results.jdbc.internal;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.internal.util.collections.CollectionHelper;
|
||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMapping;
|
||||
|
||||
/**
|
||||
@ -42,17 +40,12 @@ public List<DomainResult> getDomainResults() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DomainResultAssembler> resolveAssemblers(
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState) {
|
||||
public List<DomainResultAssembler> resolveAssemblers(AssemblerCreationState creationState) {
|
||||
final List<DomainResultAssembler> assemblers = CollectionHelper.arrayList( domainResults.size() );
|
||||
|
||||
//noinspection ForLoopReplaceableByForEach
|
||||
for ( int i = 0; i < domainResults.size(); i++ ) {
|
||||
final DomainResultAssembler resultAssembler = domainResults.get( i ).createResultAssembler(
|
||||
initializerConsumer,
|
||||
creationState
|
||||
);
|
||||
final DomainResultAssembler resultAssembler = domainResults.get( i ).createResultAssembler( creationState );
|
||||
|
||||
assemblers.add( resultAssembler );
|
||||
}
|
||||
|
@ -7,12 +7,10 @@
|
||||
package org.hibernate.sql.results.jdbc.spi;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.hibernate.sql.results.graph.AssemblerCreationState;
|
||||
import org.hibernate.sql.results.graph.DomainResult;
|
||||
import org.hibernate.sql.results.graph.DomainResultAssembler;
|
||||
import org.hibernate.sql.results.graph.Initializer;
|
||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
||||
|
||||
/**
|
||||
@ -33,7 +31,5 @@ public interface JdbcValuesMapping {
|
||||
|
||||
List<DomainResult> getDomainResults();
|
||||
|
||||
List<DomainResultAssembler> resolveAssemblers(
|
||||
Consumer<Initializer> initializerConsumer,
|
||||
AssemblerCreationState creationState);
|
||||
List<DomainResultAssembler> resolveAssemblers(AssemblerCreationState creationState);
|
||||
}
|
||||
|
@ -13,6 +13,7 @@
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.Hibernate;
|
||||
|
||||
@ -36,63 +37,36 @@
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
ManyToOneEmbeddedIdWithToOneFKTest.System.class,
|
||||
ManyToOneEmbeddedIdWithToOneFKTest.SystemUser.class,
|
||||
ManyToOneEmbeddedIdWithToOneFKTest.Subsystem.class
|
||||
ManyToOneEmbeddedIdWithToOneFKTest.DataCenterUser.class,
|
||||
ManyToOneEmbeddedIdWithToOneFKTest.DataCenter.class
|
||||
}
|
||||
)
|
||||
@SessionFactory(statementInspectorClass = SQLStatementInspector.class)
|
||||
public class ManyToOneEmbeddedIdWithToOneFKTest {
|
||||
|
||||
@BeforeEach
|
||||
public void setUp(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Subsystem subsystem = new Subsystem( 2, "sub1" );
|
||||
PK userKey = new PK( subsystem, "Fab" );
|
||||
SystemUser user = new SystemUser( userKey, "Fab" );
|
||||
|
||||
System system = new System( 1, "sub1" );
|
||||
system.setUser( user );
|
||||
|
||||
session.save( subsystem );
|
||||
session.save( user );
|
||||
session.save( system );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from System" ).executeUpdate();
|
||||
session.createQuery( "delete from SystemUser" ).executeUpdate();
|
||||
session.createQuery( "delete from Subsystem" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGet(SessionFactoryScope scope) {
|
||||
SQLStatementInspector statementInspector = (SQLStatementInspector) scope.getStatementInspector();
|
||||
statementInspector.clear();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
System system = session.get( System.class, 1 );
|
||||
final System system = session.get( System.class, 1 );
|
||||
assertThat( system, is( notNullValue() ) );
|
||||
assertThat( system.getId() , is(1) );
|
||||
assertThat( system.getId() , is(1 ) );
|
||||
|
||||
assertTrue( Hibernate.isInitialized( system.getUser() ) );
|
||||
assertThat( system.getDataCenterUser(), notNullValue() );
|
||||
assertThat( system.getDataCenterUser().getPk(), notNullValue() );
|
||||
assertTrue( Hibernate.isInitialized( system.getDataCenterUser() ) );
|
||||
|
||||
PK pk = system.getUser().getPk();
|
||||
assertTrue( Hibernate.isInitialized( pk.subsystem ) );
|
||||
final PK pk = system.getDataCenterUser().getPk();
|
||||
assertTrue( Hibernate.isInitialized( pk.dataCenter ) );
|
||||
|
||||
assertThat( pk.username, is( "Fab"));
|
||||
assertThat( pk.subsystem.id, is( 2));
|
||||
assertThat( pk.subsystem.getDescription(), is( "sub1"));
|
||||
assertThat( pk.username, is( "Fab" ) );
|
||||
assertThat( pk.dataCenter.id, is( 2 ) );
|
||||
assertThat( pk.dataCenter.getDescription(), is( "Raleigh" ) );
|
||||
|
||||
SystemUser user = system.getUser();
|
||||
assertThat( user, is( notNullValue() ) );
|
||||
final DataCenterUser user = system.getDataCenterUser();
|
||||
assertThat( user, notNullValue() );
|
||||
|
||||
statementInspector.assertExecutedCount( 1 );
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 2 );
|
||||
@ -106,39 +80,64 @@ public void testHql(SessionFactoryScope scope) {
|
||||
statementInspector.clear();
|
||||
/*
|
||||
select
|
||||
s1_0.id_,
|
||||
s1_0.name as name2_1_,
|
||||
s1_0.user_subsystem_id ,
|
||||
s1_0.user_username_
|
||||
s1_0.id,
|
||||
s1_0.dataCenterUser_dataCenter_id,
|
||||
s1_0.dataCenterUser_username,
|
||||
s1_0.name
|
||||
from
|
||||
System s1_0
|
||||
where
|
||||
s1_0.id=?
|
||||
|
||||
select
|
||||
s2_0.id,
|
||||
s2_0.description_
|
||||
select
|
||||
d1_0.id,
|
||||
d1_0.description
|
||||
from
|
||||
Subsystem s2_0
|
||||
where
|
||||
s2_0.id=?
|
||||
data_center as d1_0
|
||||
where
|
||||
d1_0.id = ?
|
||||
|
||||
select
|
||||
s1_0.subsystem_id,
|
||||
s1_0.username
|
||||
d1_0.dataCenter_id,
|
||||
d1_0.username,
|
||||
d1_0.privilegeMask
|
||||
from
|
||||
SystemUser as s1_0
|
||||
data_center_user as d1_0
|
||||
where
|
||||
(
|
||||
s1_0.subsystem_id, s1_0.username
|
||||
d1_0.dataCenter_id, d1_0.username
|
||||
) in (
|
||||
(
|
||||
?, ?
|
||||
)
|
||||
)
|
||||
|
||||
NOTE: currently the 3rd query is:
|
||||
|
||||
select
|
||||
d2_0.id,
|
||||
d2_0.description,
|
||||
d1_0.dataCenter_id,
|
||||
d1_0.username,
|
||||
d1_0.privilegeMask
|
||||
from
|
||||
data_center_user as d1_0
|
||||
inner join
|
||||
data_center as d2_0
|
||||
on d1_0.dataCenter_id = d2_0.id
|
||||
where
|
||||
(
|
||||
d1_0.dataCenter_id, d1_0.username
|
||||
) in (
|
||||
(
|
||||
?, ?
|
||||
)
|
||||
)
|
||||
*/
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
// this HQL should load the System with id = 1
|
||||
|
||||
System system = (System) session.createQuery( "from System e where e.id = :id" )
|
||||
.setParameter( "id", 1 ).uniqueResult();
|
||||
|
||||
@ -150,16 +149,16 @@ public void testHql(SessionFactoryScope scope) {
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 2, "join", 0 );
|
||||
|
||||
|
||||
assertTrue( Hibernate.isInitialized( system.getUser() ) );
|
||||
assertTrue( Hibernate.isInitialized( system.getDataCenterUser() ) );
|
||||
|
||||
final PK pk = system.getUser().getPk();
|
||||
assertTrue( Hibernate.isInitialized( pk.subsystem ) );
|
||||
final PK pk = system.getDataCenterUser().getPk();
|
||||
assertTrue( Hibernate.isInitialized( pk.dataCenter ) );
|
||||
|
||||
assertThat( pk.username, is( "Fab"));
|
||||
assertThat( pk.subsystem.id, is( 2));
|
||||
assertThat( pk.subsystem.getDescription(), is( "sub1"));
|
||||
assertThat( pk.username, is( "Fab" ) );
|
||||
assertThat( pk.dataCenter.id, is( 2 ) );
|
||||
assertThat( pk.dataCenter.getDescription(), is( "Raleigh" ) );
|
||||
|
||||
SystemUser user = system.getUser();
|
||||
DataCenterUser user = system.getDataCenterUser();
|
||||
assertThat( user, is( notNullValue() ) );
|
||||
statementInspector.assertExecutedCount( 3 );
|
||||
}
|
||||
@ -172,14 +171,14 @@ public void testHqlJoin(SessionFactoryScope scope) {
|
||||
statementInspector.clear();
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
System system = session.createQuery( "from System e join e.user where e.id = :id", System.class )
|
||||
System system = session.createQuery( "from System e join e.dataCenterUser where e.id = :id", System.class )
|
||||
.setParameter( "id", 1 ).uniqueResult();
|
||||
statementInspector.assertExecutedCount( 3 );
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 1 );
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 1, "join", 0 );
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 2, "join", 0 );
|
||||
assertThat( system, is( notNullValue() ) );
|
||||
SystemUser user = system.getUser();
|
||||
DataCenterUser user = system.getDataCenterUser();
|
||||
assertThat( user, is( notNullValue() ) );
|
||||
}
|
||||
);
|
||||
@ -192,7 +191,7 @@ public void testHqlJoinFetch(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
System system = session.createQuery(
|
||||
"from System e join fetch e.user where e.id = :id",
|
||||
"from System e join fetch e.dataCenterUser where e.id = :id",
|
||||
System.class
|
||||
)
|
||||
.setParameter( "id", 1 ).uniqueResult();
|
||||
@ -200,7 +199,7 @@ public void testHqlJoinFetch(SessionFactoryScope scope) {
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 1 );
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 1, "join", 0 );
|
||||
assertThat( system, is( notNullValue() ) );
|
||||
SystemUser user = system.getUser();
|
||||
DataCenterUser user = system.getDataCenterUser();
|
||||
assertThat( user, is( notNullValue() ) );
|
||||
}
|
||||
);
|
||||
@ -211,9 +210,9 @@ public void testHqlJoinFetch(SessionFactoryScope scope) {
|
||||
public void testEmbeddedIdParameter(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
Subsystem subsystem = new Subsystem( 2, "sub1" );
|
||||
DataCenter dataCenter = new DataCenter( 2, "sub1" );
|
||||
|
||||
PK superUserKey = new PK( subsystem, "Fab" );
|
||||
PK superUserKey = new PK( dataCenter, "Fab" );
|
||||
|
||||
System system = session.createQuery(
|
||||
"from System e join fetch e.user u where u.id = :id",
|
||||
@ -247,7 +246,7 @@ public void testHql2(SessionFactoryScope scope) {
|
||||
*/
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
SystemUser system = (SystemUser) session.createQuery( "from SystemUser " )
|
||||
DataCenterUser system = (DataCenterUser) session.createQuery( "from DataCenterUser " )
|
||||
.uniqueResult();
|
||||
assertThat( system, is( notNullValue() ) );
|
||||
|
||||
@ -255,21 +254,81 @@ public void testHql2(SessionFactoryScope scope) {
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 0, "join", 0 );
|
||||
statementInspector.assertNumberOfOccurrenceInQuery( 1, "join", 0 );
|
||||
|
||||
assertTrue( Hibernate.isInitialized( system.getPk().subsystem ) );
|
||||
assertTrue( Hibernate.isInitialized( system.getPk().dataCenter ) );
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@BeforeEach
|
||||
public void setUp(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
DataCenter dataCenter = new DataCenter( 2, "Raleigh" );
|
||||
PK userKey = new PK( dataCenter, "Fab" );
|
||||
DataCenterUser user = new DataCenterUser( userKey, (byte) 1 );
|
||||
|
||||
System system = new System( 1, "QA" );
|
||||
system.setDataCenterUser( user );
|
||||
|
||||
session.save( dataCenter );
|
||||
session.save( user );
|
||||
session.save( system );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void tearDown(SessionFactoryScope scope) {
|
||||
scope.inTransaction(
|
||||
session -> {
|
||||
session.createQuery( "delete from System" ).executeUpdate();
|
||||
session.createQuery( "delete from DataCenterUser" ).executeUpdate();
|
||||
session.createQuery( "delete from DataCenter" ).executeUpdate();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Entity(name = "DataCenter")
|
||||
@Table(name = "data_center" )
|
||||
public static class DataCenter {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String description;
|
||||
|
||||
public DataCenter() {
|
||||
}
|
||||
|
||||
public DataCenter(Integer id, String description) {
|
||||
this.id = id;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
// public Integer getId() {
|
||||
// return id;
|
||||
// }
|
||||
}
|
||||
|
||||
@Entity(name = "System")
|
||||
@Table( name = "systems" )
|
||||
public static class System {
|
||||
@Id
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
@ManyToOne
|
||||
SystemUser user;
|
||||
DataCenterUser dataCenterUser;
|
||||
|
||||
public System() {
|
||||
}
|
||||
@ -295,29 +354,34 @@ public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public SystemUser getUser() {
|
||||
return user;
|
||||
public DataCenterUser getDataCenterUser() {
|
||||
return dataCenterUser;
|
||||
}
|
||||
|
||||
public void setUser(SystemUser user) {
|
||||
this.user = user;
|
||||
public void setDataCenterUser(DataCenterUser dataCenterUser) {
|
||||
this.dataCenterUser = dataCenterUser;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "SystemUser")
|
||||
public static class SystemUser {
|
||||
@Entity( name = "DataCenterUser" )
|
||||
@Table(name = "data_center_user" )
|
||||
public static class DataCenterUser {
|
||||
|
||||
@EmbeddedId
|
||||
private PK pk;
|
||||
|
||||
// private String name;
|
||||
private byte privilegeMask;
|
||||
|
||||
public SystemUser() {
|
||||
public DataCenterUser() {
|
||||
}
|
||||
|
||||
public SystemUser(PK pk, String name) {
|
||||
public DataCenterUser(DataCenter dataCenter, String username, byte privilegeMask) {
|
||||
this( new PK( dataCenter, username ), privilegeMask );
|
||||
}
|
||||
|
||||
public DataCenterUser(PK pk, byte privilegeMask) {
|
||||
this.pk = pk;
|
||||
// this.name = name;
|
||||
this.privilegeMask = privilegeMask;
|
||||
}
|
||||
|
||||
public PK getPk() {
|
||||
@ -341,12 +405,11 @@ public void setPk(PK pk) {
|
||||
public static class PK implements Serializable {
|
||||
|
||||
@ManyToOne
|
||||
private Subsystem subsystem;
|
||||
|
||||
private DataCenter dataCenter;
|
||||
private String username;
|
||||
|
||||
public PK(Subsystem subsystem, String username) {
|
||||
this.subsystem = subsystem;
|
||||
public PK(DataCenter dataCenter, String username) {
|
||||
this.dataCenter = dataCenter;
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
@ -362,42 +425,13 @@ public boolean equals(Object o) {
|
||||
return false;
|
||||
}
|
||||
PK pk = (PK) o;
|
||||
return Objects.equals( subsystem, pk.subsystem ) &&
|
||||
return Objects.equals( dataCenter, pk.dataCenter ) &&
|
||||
Objects.equals( username, pk.username );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash( subsystem, username );
|
||||
return Objects.hash( dataCenter, username );
|
||||
}
|
||||
}
|
||||
|
||||
@Entity(name = "Subsystem")
|
||||
public static class Subsystem {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String description;
|
||||
|
||||
public Subsystem() {
|
||||
}
|
||||
|
||||
public Subsystem(Integer id, String description) {
|
||||
this.id = id;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
// public Integer getId() {
|
||||
// return id;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ public void testCollectionInitializerCase(SessionFactoryScope scope) {
|
||||
.getDomainResultDescriptors()
|
||||
.get( 0 );
|
||||
|
||||
DomainResultGraphPrinter.print( loader.getSqlAst().getDomainResultDescriptors() );
|
||||
DomainResultGraphPrinter.logDomainResultGraph( loader.getSqlAst().getDomainResultDescriptors() );
|
||||
|
||||
assertThat( domainResult.getFetches(), isEmpty() );
|
||||
}
|
||||
|
@ -200,10 +200,7 @@ public void testConvertedHqlInterpretation(SessionFactoryScope scope) {
|
||||
|
||||
// ScalarDomainResultImpl creates and caches the assembler at its creation.
|
||||
// this just gets access to that cached one
|
||||
final DomainResultAssembler resultAssembler = domainResult.createResultAssembler(
|
||||
null,
|
||||
null
|
||||
);
|
||||
final DomainResultAssembler resultAssembler = domainResult.createResultAssembler( null );
|
||||
|
||||
assertThat( resultAssembler, instanceOf( BasicResultAssembler.class ) );
|
||||
final BasicValueConverter valueConverter = ( (BasicResultAssembler) resultAssembler ).getValueConverter();
|
||||
|
@ -28,7 +28,7 @@ public void simpleTest(SessionFactoryScope scope) {
|
||||
"select s.id, s.someString, s.someLong from SimpleEntity s",
|
||||
scope.getSessionFactory()
|
||||
);
|
||||
DomainResultGraphPrinter.print( sqlAst.getDomainResultDescriptors() );
|
||||
DomainResultGraphPrinter.logDomainResultGraph( sqlAst.getDomainResultDescriptors() );
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,6 @@ public void simpleTest(SessionFactoryScope scope) {
|
||||
"select e from EntityOfComposites e join fetch e.component c join fetch c.nested",
|
||||
scope.getSessionFactory()
|
||||
);
|
||||
DomainResultGraphPrinter.print( interpretation.getDomainResultDescriptors() );
|
||||
DomainResultGraphPrinter.logDomainResultGraph( interpretation.getDomainResultDescriptors() );
|
||||
}
|
||||
}
|
||||
|
@ -9,6 +9,11 @@ log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||
|
||||
log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout2.Target=System.out
|
||||
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout2.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||
|
||||
log4j.appender.unclosedSessionFactoryFile=org.apache.log4j.FileAppender
|
||||
log4j.appender.unclosedSessionFactoryFile.append=true
|
||||
log4j.appender.unclosedSessionFactoryFile.file=target/tmp/log/UnclosedSessionFactoryWarnings.log
|
||||
@ -17,6 +22,11 @@ log4j.appender.unclosedSessionFactoryFile.layout.ConversionPattern=%d{ABSOLUTE}
|
||||
|
||||
log4j.rootLogger=info, stdout
|
||||
|
||||
log4j.logger.org.hibernate.orm=debug, stdout2
|
||||
log4j.additivity.org.hibernate.orm=false
|
||||
|
||||
log4j.logger.org.hibernate.orm.sql.results=debug
|
||||
|
||||
log4j.logger.org.hibernate.orm.graph=debug
|
||||
log4j.logger.org.hibernate.orm.query.sqm=debug
|
||||
log4j.logger.org.hibernate.orm.query.hql=debug
|
||||
|
Loading…
x
Reference in New Issue
Block a user