Skip to content

Commit

Permalink
HHH-18773 Deduplicate result initializers to avoid double initializat…
Browse files Browse the repository at this point in the history
…ion issues
  • Loading branch information
beikov committed Oct 28, 2024
1 parent 6d93f0e commit 3737d87
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*/
package org.hibernate.sql.results.jdbc.internal;

import java.util.ArrayList;
import java.util.LinkedHashSet;

import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.Initializer;
Expand Down Expand Up @@ -39,7 +39,7 @@ private JdbcValuesMappingResolutionImpl(
}

private static Initializer<?>[] getResultInitializers(DomainResultAssembler<?>[] resultAssemblers) {
final ArrayList<Initializer<?>> initializers = new ArrayList<>( resultAssemblers.length );
final LinkedHashSet<Initializer<?>> initializers = new LinkedHashSet<>( resultAssemblers.length );
for ( DomainResultAssembler<?> resultAssembler : resultAssemblers ) {
resultAssembler.forEachResultAssembler( (initializer, list) -> list.add( initializer ), initializers );
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* 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.orm.test.query;

import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@DomainModel(annotatedClasses = {
SelectJoinedAssociationMultipleTimesTest.Book.class
})
@SessionFactory
public class SelectJoinedAssociationMultipleTimesTest {

@Test
public void test(SessionFactoryScope scope) {
scope.inTransaction(
session -> {
// Add a proxy first to trigger the error
session.getReference( Book.class, 1 );
session.createSelectionQuery( "select b b1, b b2 from Book b", Object[].class ).getResultList();
}
);
}

@BeforeEach
public void prepareTestData(SessionFactoryScope scope) {
scope.inTransaction( (session) -> session.persist( new Book( 1, "First book" ) ) );
}

@AfterEach
public void dropTestData(SessionFactoryScope scope) {
scope.inTransaction( (session) -> session.createMutationQuery( "delete Book" ).executeUpdate() );
}

@Entity( name = "Book")
public static class Book {
@Id
private Integer id;
private String name;

public Book() {
}

public Book(Integer id, String name) {
this.id = id;
this.name = name;
}
}
}

0 comments on commit 3737d87

Please sign in to comment.