-1

I recently upgraded my project from Spring boot 2.7 to 3.1. Hibernate and JPA are also upgraded automatically. However, after the update, I am getting this error:

java.lang.UnsupportedOperationException
    at org.hibernate.type.descriptor.java.spi.CollectionJavaType.extractHashCode(CollectionJavaType.java:126)
    at org.hibernate.type.internal.ConvertedBasicTypeImpl.getHashCode(ConvertedBasicTypeImpl.java:208)
    at org.hibernate.type.internal.ConvertedBasicTypeImpl.getHashCode(ConvertedBasicTypeImpl.java:213)
    at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:270)
    at org.hibernate.engine.spi.EntityKey.generateHashCode(EntityKey.java:60)
    at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:53)
    at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveEntityKey(AbstractEntityInitializer.java:352)
    at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.resolveKey(AbstractEntityInitializer.java:288)
    at org.hibernate.sql.results.internal.InitializersList.resolveKeys(InitializersList.java:82)
    at org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:109)
    at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:87)
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:199)
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:361)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93)
    at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:110)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:303)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:244)
    at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:518)
    at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367)
    at org.hibernate.query.Query.getResultList(Query.java:119)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:382)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:95)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)

When I deepdive into the error, I am getting:

(java.lang.string and java.util.list are in module java.base of loader 'bootstrap')

I am getting those errors while executing findAll method:

BenchmarkCategoryRequestDto requestDto = new BenchmarkCategoryRequestDto(APP_ID, DATE);
        benchmarkCategoryService.upsertBenchmarkCategory(requestDto);

        List<BenchmarkCategory> benchmarkCategories = benchmarkCategoryRepository.findAll();

I am using StringListConverter here:

public class BenchmarkCategory
{
    @Id
    @Column(name = "category_id")
    private Integer categoryId;

    @Id
    @Column(name = "country")
    private String country;

    @Id
    @Column(name = "date")
    private LocalDate date;

    @Id
    @Convert(converter = StringListConverter.class)
    @Column(name = "supply_sources")
    private List<String> supplySources;

And here is my StringListConverter:

@Converter
public class StringListConverter implements AttributeConverter<List<String>, String>
{
    @Override
    public String convertToDatabaseColumn(List<String> list)
    {
        return CollectionUtils.isEmpty(list) ? null : String.join(",", list);
    }

    @Override
    public List<String> convertToEntityAttribute(String joined)
    {
        return StringUtils.hasLength(joined) ? new ArrayList<>(Arrays.asList(joined.split(","))) : null;
    }
}

I searched on the internet and found that id columns should not have converter. I also tried to remove id from supplySources however I am still getting the same error. Do you have any idea to solve this error? Thanks in advance.

I tried to remove id and use mutable lists in converter class.

  • You are returning `null` afaik an `@Id` cannot have `null` values. Also why is this an `@Id` to start with. – M. Deinum Aug 17 '23 at 07:44
  • I also tried to set null values to empty array and empty string but still does not work. This field should be id and it is mandatory :( – Abdullah Koç Aug 17 '23 at 11:03

0 Answers0