NullPointerException Причина: org.hibernate.MappingException: Не удалось создать экземпляр Тип: com.vladmihalcea.hibernate.type.array.StringArrayType - PullRequest
0 голосов
/ 31 октября 2019

Когда я пытаюсь запустить собственный запрос, я получаю сообщение об ошибке ниже, когда пытаюсь запустить native query в весеннем jpa. Я добавил диалект к пользовательскому диалекту, расширенному как

spring.jpa.database-platform = com.config.HibernateCustomDialect

Caused by: java.lang.NullPointerException: null
at com.vladmihalcea.hibernate.type.array.internal.AbstractArrayTypeDescriptor.setParameterValues(AbstractArrayTypeDescriptor.java:34) ~[hibernate-types-52-2.6.1.jar:na]
at com.vladmihalcea.hibernate.type.array.StringArrayType.setParameterValues(StringArrayType.java:50) ~[hibernate-types-52-2.6.1.jar:na]
at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:149) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
at org.hibernate.type.TypeFactory.type(TypeFactory.java:135) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]

Ниже моя сущность

@Entity
@Getter
@Setter
@NoArgsConstructor
@TypeDef(
    name = "string-array",
    typeClass = StringArrayType.class
)
public class Session {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long sessionId;

   @Type(type = "string-array")
   @Column(columnDefinition = "text[]", name = "tags")
   private String[] tags = null;

   private long oId;

   // More Fields

}   

Пользовательский диалект

public class HibernateCustomDialect extends org.hibernate.dialect.PostgreSQL94Dialect {
    private static final Logger log = LoggerFactory.getLogger(HibernateCustomDialect.class);


    public HibernateCustomDialect() {
       super();
       log.info("Registering Custom Hibernate Dialect - {}",HibernateCustomDialect.class.getName());
       this.registerHibernateType(Types.ARRAY, StringArrayType.class.getName());
    }
}

Jpa Repository

@Repository
public interface SessionRepository extends JpaRepository<Session, Long> {
   String sessionSummaryViewQuery ="SELECT session.session_id, session.tags FROM public.session WHERE session.oid=?1"

   @Query(value =sessionSummaryViewQuery,nativeQuery = true)
   List<SessionSummaryView> findByOpportunityId(long opportunityId);//, Pageable pageable);


}

И мой DTO:

public class SessionSummaryView {
    private Long sessionId;
    private String[] tags;
    private Long oid;


}

StringTypeArray является реализацией вследующая библиотека.

 <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.6.1</version>
        </dependency>

1 Ответ

0 голосов
/ 31 октября 2019

Пройдя через Интернет и просканировав все страницы, связанные с гибернацией, я нашел обходной путь.

Я реализовал CustomStringArrayType расширение com.vladmihalcea.hibernate.type.array.StringArrayType.

ref - https://github.com/vladmihalcea/hibernate-types/issues/142 Я не мог дождаться объединения PR, поэтому применил обходной путь, как показано ниже:

public class CustomStringArrayType extends StringArrayType {

  @Override
  public void setParameterValues(Properties parameters) {

    if (parameters.containsKey(super.PARAMETER_TYPE)) {
        super.setParameterValues(parameters);

    }
  }
}

Мой измененный HibernateDialect выглядит следующим образом:

public class HibernateCustomDialect extends org.hibernate.dialect.PostgreSQL94Dialect {
  private static final Logger log = LoggerFactory.getLogger(HibernateCustomDialect.class);


  public HibernateCustomDialect() {
    super();
    log.info("Registering Custom Hibernate Dialect - {}",HibernateCustomDialect.class.getName());
    this.registerHibernateType(Types.ARRAY, CustomStringArrayType.class.getName());
  }
}
...