Fix issue with DatabaseSnapshotExecutor not returning the correct array

This commit is contained in:
Andrea Boriero 2020-08-05 14:11:04 +01:00
parent 45328a574b
commit 34a5274b3f
4 changed files with 51 additions and 8 deletions

View File

@ -43,7 +43,7 @@ import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.basic.BasicResult;
import org.hibernate.sql.results.internal.RowTransformerPassThruImpl;
import org.hibernate.sql.results.internal.RowTransformerDatabaseSnapshotImpl;
import org.jboss.logging.Logger;
@ -242,7 +242,7 @@ class DatabaseSnapshotExecutor {
return null;
}
},
RowTransformerPassThruImpl.instance(),
RowTransformerDatabaseSnapshotImpl.instance(),
true
);
@ -251,12 +251,14 @@ class DatabaseSnapshotExecutor {
}
final int size = list.size();
final Object[] values = new Object[size];
for ( int i = 0; i < size; i++ ) {
values[i] = list.get( i );
}
assert size <= 1;
return values;
if ( size == 0 ) {
return null;
}
else {
return (Object[]) list.get( 0 );
}
}
}

View File

@ -673,7 +673,7 @@ public abstract class Collection implements Fetchable, Value, Filterable {
@Override
public boolean hasAnyUpdatableColumns() {
return true;
return false;
}
public boolean isSubselectLoadable() {

View File

@ -14,6 +14,7 @@ import org.hibernate.mapping.ManyToOne;
import org.hibernate.mapping.OneToOne;
import org.hibernate.mapping.ToOne;
import org.hibernate.metamodel.mapping.AssociationKey;
import org.hibernate.metamodel.mapping.ColumnConsumer;
import org.hibernate.metamodel.mapping.EntityAssociationMapping;
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
@ -612,4 +613,11 @@ public class ToOneAttributeMapping extends AbstractSingularAttributeMapping
public String toString() {
return "SingularAssociationAttributeMapping {" + navigableRole + "}";
}
@Override
public void visitColumns(ColumnConsumer consumer) {
if ( foreignKeyDirection == ForeignKeyDirection.FROM_PARENT ) {
foreignKeyDescriptor.visitReferringColumns( consumer );
}
}
}

View File

@ -0,0 +1,33 @@
/*
* 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.internal;
import org.hibernate.sql.results.spi.RowTransformer;
/**
* @author Andrea Boriero
*/
public class RowTransformerDatabaseSnapshotImpl<T> implements RowTransformer<T> {
/**
* Singleton access
*/
public static final RowTransformerDatabaseSnapshotImpl INSTANCE = new RowTransformerDatabaseSnapshotImpl();
@SuppressWarnings("unchecked")
public static <T> RowTransformerDatabaseSnapshotImpl<T> instance() {
return INSTANCE;
}
private RowTransformerDatabaseSnapshotImpl() {
}
@Override
@SuppressWarnings("unchecked")
public T transformRow(Object[] row) {
return (T) row;
}
}