Решено с помощью обходного пути, читайте снизу
У меня есть модель под названием «EmailTransmitido»:
@Data
@Entity
@Builder
@Table(schema = "EMAIL", name = "EN_EMAIL_TRANSMITIDO")
public class EmailTransmitido extends EntidadeBase {
...
@ManyToOne
@JoinColumn(name = "NRO_EMAIL")
private EmailMensagem emailMensagem;
...
И еще один, называемый EmailMensagem:
@Data
@Entity
@Table(schema = "EMAIL", name = "EN_MENSAGEM_EMAIL")
public class EmailMensagem extends EntidadeBase {
...
@Column(name = "TXT_TITULO")
private String txtTitulo;
@Column(name = "TXT_MENSAGEM")
private String txtMensagem;
...
Тогда мне нужно искать в этом поле "
@Repository
public interface EmailTransmitidoRepository extends JpaRepository<EmailTransmitido, Long> {
...
@Query("SELECT et FROM EmailTransmitido et WHERE et.recursoHumano = ?1 "
+ "AND et.emailMensagem.txtMensagem LIKE %?2%")
Page<EmailTransmitido> getMensagensNotArquivadasByEnRh(
@Param("enRh") EnRh enRh, @Param("pesquisa") String pesquisa, Pageable pageable);
...
Но я получаю сообщение об ошибке:
Hibernate:
select
*
from
( select
emailtrans0_.SEQ_EMAIL_TRANSMITIDO as SEQ_EMAIL_TRANSMIT1_5_,
emailtrans0_.TXT_CAMPOS_MSG as TXT_CAMPOS_MSG2_5_,
emailtrans0_.DTA_AGENDA as DTA_AGENDA3_5_,
emailtrans0_.DTA_ULT_ATUALIZ as DTA_ULT_ATUALIZ4_5_,
emailtrans0_.DTA_ENVIO as DTA_ENVIO5_5_,
emailtrans0_.NRO_EMAIL as NRO_EMAIL6_5_,
emailtrans0_.STA_EMAIL_TESTE as STA_EMAIL_TESTE7_5_,
emailtrans0_.TXT_USERNAME_ULT_ATUALIZ as TXT_USERNAME_ULT_A8_5_,
emailtrans0_.NRO_MODELO_DOC as NRO_MODELO_DOC9_5_,
emailtrans0_.COD_RH as COD_RH17_5_,
emailtrans0_.STA_EMAIL_TRANSMITIDO as STA_EMAIL_TRANSMI10_5_,
emailtrans0_.TXT_CAMPOS_MSG_BKP as TXT_CAMPOS_MSG_BK11_5_,
emailtrans0_.TXT_EMAIL as TXT_EMAIL12_5_,
emailtrans0_.TXT_EMAIL_COPIA as TXT_EMAIL_COPIA13_5_,
emailtrans0_.TXT_EMAIL_COPIA_OCULTA as TXT_EMAIL_COPIA_O14_5_,
emailtrans0_.TXT_ERRO_TRANSMISSAO as TXT_ERRO_TRANSMIS15_5_,
emailtrans0_.TXT_REMETENTE as TXT_REMETENTE16_5_
from
EMAIL.EN_EMAIL_TRANSMITIDO emailtrans0_ cross
join
EMAIL.EN_MENSAGEM_EMAIL emailmensa1_
where
emailtrans0_.NRO_EMAIL=emailmensa1_.NRO_EMAIL
and emailtrans0_.COD_RH=?
and (
TO_CLOB(emailmensa1_.TXT_MENSAGEM) like ?
)
order by
emailtrans0_.SEQ_EMAIL_TRANSMITIDO desc )
where
rownum <= ?
2019-06-03 16:49:12.542 WARN 10560 --- [nio-9500-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 932, SQLState: 42000
2019-06-03 16:49:12.542 ERROR 10560 --- [nio-9500-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-00932: tipos de dados inconsistentes: esperava CHAR obteve LONG
2019-06-03 16:49:12.549 ERROR 10560 --- [nio-9500-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/cm-api] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
java.sql.SQLSyntaxErrorException: ORA-00932: tipos de dados inconsistentes: esperava CHAR obteve LONG
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:886) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3657) ~[ojdbc6.jar:11.2.0.4.0]
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495) ~[ojdbc6.jar:11.2.0.4.0]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.2.0.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.2.0.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.getResultSet(Loader.java:2167) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1930) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1892) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:937) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2689) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2672) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2506) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.Loader.list(Loader.java:2501) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:504) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:395) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:220) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1508) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1537) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.query.Query.getResultList(Query.java:135) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.doExecute(JpaQueryExecution.java:194) ~[spring-data-jpa-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91) ~[spring-data-jpa-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136) ~[spring-data-jpa-2.1.5.RELEASE.jar:2.1.5.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125) ~[spring-data-jpa-2.1.5.RELEASE.jar:2.1.5.RELEASE]
Этот тип ошибки "java.sql.SQLSyntaxErrorException: ORA-00932: несоответствие типов данных: esperava CHAR obteve LONG", что означает, что "ожидаемый CHAR получил LONG" будет что-то связанное с типом LONG в Oracle осуждается ? Я имею в виду, что поле других, использующее разные типы данных, хорошо работает с похожими поисковыми запросами.
Я пытался использовать @Formula вместо @Column, но это не сработало:
@Formula("TOCLOB(TXT_MENSAGEM)")
private String txtMensagem;
Я тоже пытался использовать метод JPQ Query, но проблема сохраняется, только с этим конкретным полем LONG. Моя главная проблема заключается в том, что я не могу изменить тип данных в Oracle, потому что это старая база данных клиента, из которой я могу только читать, и у меня нет разрешения вносить изменения, поэтому есть какой-то обходной путь для сравнения этого поля с JPA?
Я решил эту проблему с помощью другой таблицы, созданной для хранения этих данных в формате CLOB. Поскольку столбец имеет фиксированное значение, а потребитель не возражает против этого. Здесь нужно сказать, что я много искал и, похоже, пока не нашел подходящего решения, поэтому, если вы тоже столкнулись с этой проблемой, подумайте о том же или измените тип данных столбца. Спасибо всем за помощь.