Код: Выделить всё
@Repository
public interface FooRepository extends JpaRepository, JpaSpecificationExecutor {
@Query(
"""
SELECT o FROM Foo o
JOIN Fee e on o.feeId = e.id
JOIN Fii i on e.fiiId = i.id
WHERE i.id = :fiiId
AND o.id IN (
SELECT u.id
FROM Fuu u
JOIN Foo o2 on u.fooId = o2.id
WHERE u.something LIKE CONCAT('%', :param1, '_', :param2, '%')
)""")
List findByFiiIdAndFuuLikeSomeComputed(
Long fiiId, String param1, char param2);
}
< /code>
Примечания: < /p>
u.somethingКод: Выделить всё
@Nullable
@Column(name = "SOMETHING", length = 25000)
private String something;
Код: Выделить всё
select foo0_.ID as id1_18_,
...
from FOO foo0_
inner join FEE fee1_ on (foo0_.FEE_ID = fee1_.ID)
inner join FII fii2_ on (fee1_.FII_ID = fii2_.ID)
where fii2_.ID = ?
and (foo0_.ID in (select foo4_.ID
from FUU fuu3_
inner join FOO foo4_
on (fuu3_.FOO_ID = fuu4_.ID)
where foo3.SOMETHING like '%' || ? || '_' || ? || '%'))
< /code>
[b] после того, как я обновлен до Hibernate 6: < /strong> < /p>
[*]"Could not convert 'java.lang.Character' to 'java.lang.String' using 'org.hibernate.type.descriptor.java.StringJavaType' to wrap"Запрос теперь включает в себя CAST , который не поддерживается DB2 Z/OS.
Код: Выделить всё
select fo1_0.ID,
...
from FOO fo1_0
join FEE fe1_0 on fo1_0.FEE_ID = fe1_0.ID
join FII fi1_0 on fe1_0.FII_ID = fi1_0.ID
where fi1_0.ID = ?
and fo1_0.ID in (
select
fo2_0.ID
from FUU fu1_0
join FOO fo2_0 on fu1_0.FOO_ID = fo2_0.ID
where fu1_0.SOMETHING like cast('%' || cast(? as varchar(25000)) || '_' || cast(? as varchar(25000)) || '%' as varchar(32672)))
I tried to find appropriate functions in SqlAstTranslator or SqlAstWalker and overwrote them, but it does not seem the generated query comes from here.
EDIT:[/b]
This is currently the Диалект, который я пришел, работал до сих пор, но задача актерского состава остается: < /p>
legacydb2dialect.java
Код: Выделить всё
import org.hibernate.dialect.DB2zDialect;
import org.hibernate.dialect.pagination.LegacyDB2LimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
public class LegacyDb2Dialect extends DB2zDialect {
@Override
public LimitHandler getLimitHandler() {
return LegacyDB2LimitHandler.INSTANCE;
}
@Override
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
return new StandardSqlAstTranslatorFactory() {
@Override
protected SqlAstTranslator buildTranslator(
SessionFactoryImplementor sessionFactory, Statement statement) {
return new LegacyDb2SqlAstTranslator(sessionFactory, statement, getVersion());
}
};
}
}
< /code>
legacydb2sqlasttranslator.java
import org.hibernate.dialect.DB2zSqlAstTranslator;
import org.hibernate.dialect.DatabaseVersion;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.exec.spi.JdbcOperation;
public class LegacyDb2SqlAstTranslator extends DB2zSqlAstTranslator {
public LegacyDb2SqlAstTranslator(
SessionFactoryImplementor sessionFactory, Statement statement, DatabaseVersion version) {
super(sessionFactory, statement, version);
}
@Override
protected boolean supportsOffsetClause() {
return false;
}
}
Я обнаружил, что слезы также выполняются при использовании спецификации/критерии и типов столбцов, таких как Bigint.
Подробнее здесь: https://stackoverflow.com/questions/782 ... parameters