Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / null в качестве параметра в запросе hibernate / 18 сообщений из 18, страница 1 из 1
13.03.2015, 18:59
    #38904441
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Добрый день!

Я использую репозитории spring data jpa и хочу передать null в качестве параметра в запрос описанный аннотацией @Query . Это сделано для простого фильтра, что бы в случае null возвращались все записи.

Репозиторий:
Код: java
1.
2.
3.
public interface ModelRepository extends PagingAndSortingRepository<Model, Integer>, JpaSpecificationExecutor<Model> {
@Query(value = "from models ent where ((:idCategory is null or ent.idCategory = :idCategory)and (:idType is null or ent.idType = :idType)) ")
Page<Model> findAllForTest(@Param("idCategory") Integer idCategory, @Param("idType") Integer idType, Pageable pageable);



Энтити:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Entity(name = "models")
@Table(name = "models")
public class Model implements Serializable {
    @Id
    @SequenceGenerator(name = "modelsSeq", sequenceName = "models_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "modelsSeq")
    @Column(name = "id_model", unique = true, nullable = false)
    private Integer idModel;
    @Column(name = "id_category")
    private Integer idCategory;
    @Column(name = "id_type")
    private Integer idType;
}



Тест выглядит так:
Код: java
1.
2.
for (Model m : modelRepository.findAllForTest(null, pageable))
System.out.println("model:" + m.getTitle());



Зависимости:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
            "org.springframework:spring-orm:4.1.4.RELEASE",
            "org.springframework:spring-aop:4.1.4.RELEASE",
            "org.springframework:spring-aspects:4.1.4.RELEASE",
            "org.hibernate:hibernate-entitymanager:4.3.8.Final",
            "org.hibernate:hibernate-validator:5.1.3.Final",
            "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final",
            "org.springframework.data:spring-data-jpa:1.7.2.RELEASE",
            "net.kaczmarzyk:specification-arg-resolver:0.4.1",
            "org.postgresql:postgresql:9.3-1102-jdbc41",



Ошибка:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:231)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:214)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy52.findAllForShop2(Unknown Source)
at app.madebyy.persistence.repository.TestRepository.test(TestRepository.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
at org.hibernate.loader.Loader.doQuery(Loader.java:910)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
at org.hibernate.loader.Loader.doList(Loader.java:2554)
at org.hibernate.loader.Loader.doList(Loader.java:2540)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
at org.hibernate.loader.Loader.list(Loader.java:2365)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.doExecute(JpaQueryExecution.java:175)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:74)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:97)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:88)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:395)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 56 more
Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: integer = bytea
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 103
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:304)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
... 84 more


Как я понял, передавать null нельзя и надо формировать все критерии фильтрации с помощью Specification. Но мне кажется, что так запросы будут менее наглядны и я бы хотел иметь просто sql (hsql) с параметрами.

Возможно это как-то превозмочь?

Спасибо.
...
Рейтинг: 0 / 0
18.03.2015, 13:04
    #38908252
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
На данном этапе пришел к такому решению:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    @PersistenceContext
    private EntityManager em;

    public List<Model> findAllForTest(Integer idCategor, Integer idType) {
        StringBuffer sql = new StringBuffer("select ent.* from models ent where true ");
        if (idCategory != null)
            sql.append(" and (ent.idCategory = :idCategory)");
        if (idType != null)
            sql.append(" and (ent.idCategory = :idType)");
        Query query = em.createQuery(sql.toString(), Model.class);
        if (idCategory != null)
            query.setParameter("idCategory", idCategory);
        if (idType != null)
            query.setParameter("idType", idType);

        List<Model> list = query.getResultList();

        return list;
    }



Но написание таких составных sql у меня вызывает боль.
Уже прихожу к решению написать свой маленьких ORM и CRUD на его основе.

Очень жду каких-либо возможных решений по моему вопросу.

И подскажите, пожалуйста, есть ли альтернативы hibernate (желательно с jpa)?
...
Рейтинг: 0 / 0
18.03.2015, 13:15
    #38908273
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Небольшая описочка, разумеется
Код: java
1.
            sql.append(" and (ent.idCategory = :idType)");



А теперь свои записи редактировать нельзя?
...
Рейтинг: 0 / 0
18.03.2015, 13:17
    #38908279
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Да твою печенюху
Код: java
1.
   sql.append(" and (ent.idType = :idType)");
...
Рейтинг: 0 / 0
18.03.2015, 13:22
    #38908288
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
не надо писать эти запросы, за вас их напишет Criteria api
...
Рейтинг: 0 / 0
18.03.2015, 13:23
    #38908290
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
1) Судя по ошибке, такое в принципе не возможно на уровне SQL/Postgres. Пробовали выполнить ваш запрос на SQL с null значением? JPA и Spring Data здесь не при делах.
2) JPA провайдеров существует масса. Google -> JPA Providers. Из бесплатных довольно популярен Eclipse Link. Но лучше Hibernate, ИМХО всё равно нет.
3) Для того чтобы не выносить себе мозг конкатенацией строк придумали Criteria API и всяческие QueryDSL. С ними подобный код легко упрощается и абстрагируется.
...
Рейтинг: 0 / 0
18.03.2015, 13:33
    #38908310
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
MarMot,

а попробуй так
nullif(:idCategory,ent.idCategory) is nul and nullif(:idType,ent.idType) is null
или через coalesce можно
...
Рейтинг: 0 / 0
18.03.2015, 13:55
    #38908353
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
SQL (postgres) отрабатывает корректно, для него сравнение с null всегда возвращает false.
Код: plsql
1.
select ent.* from models ent where null is null or null = id_category


так же это все работает в JDBC

Если тип данных был неизвестен, то это решалось приведением типа
Код: plsql
1.
select ent.* from models ent where $1::integer is null or $1::integer = id_category



Criteria API и QueryDSL выход, но сложные запросы описывать будет крайне сложно, да и наглядность опять же хромает по сразнению с SQL
...
Рейтинг: 0 / 0
18.03.2015, 14:05
    #38908379
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Пробовал:
Код: java
1.
2.
    @Query(value = "from models ent where (ent.idCategory = coalesce(:idCategory, ent.idCategory))) ")
    Page<Model> findAllForShop(@Param("idCategory") Integer idCategory, Pageable pageable);



Получаю ту же ошибку:
Caused by: org.postgresql.util.PSQLException: ERROR: COALESCE types bytea and integer cannot be matched
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:231)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:214)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy52.findAllForShop0(Unknown Source)
at app.madebyy.test.TestQuery.test(TestQuery.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
at org.hibernate.loader.Loader.doQuery(Loader.java:910)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
at org.hibernate.loader.Loader.doList(Loader.java:2554)
at org.hibernate.loader.Loader.doList(Loader.java:2540)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
at org.hibernate.loader.Loader.list(Loader.java:2365)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$PagedExecution.doExecute(JpaQueryExecution.java:175)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:74)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:97)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:88)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:395)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 56 more
Caused by: org.postgresql.util.PSQLException: ERROR: COALESCE types bytea and integer cannot be matched
Position: 103
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:419)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:304)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
...
Рейтинг: 0 / 0
18.03.2015, 14:09
    #38908395
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
MarMot,

Можно попробовать через CAST() указать явный тип переменной.
...
Рейтинг: 0 / 0
18.03.2015, 14:19
    #38908405
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Blazkowicz, собственно
Код: java
1.
2.
    @Query(value = "from models ent where (ent.idCategory = coalesce(cast(:idCategory as integer), ent.idCategory))) ")
    Page<Model> findAllForShop0(@Param("idCategory") Integer idCategory, Pageable pageable);


И результат
Caused by: org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to integer
...
Рейтинг: 0 / 0
18.03.2015, 14:56
    #38908502
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
MarMot,

Похоже что это бага в Hibernate с угадыванием типа для null:
http://stackoverflow.com/questions/8211195/postgresql-jdbc-null-string-taken-as-a-bytea

Как вариант, можно использовать любой API где тип параметра задаётся явно.
...
Рейтинг: 0 / 0
18.03.2015, 14:57
    #38908505
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
...
Рейтинг: 0 / 0
18.03.2015, 14:58
    #38908510
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Очень странно, но вот тут пишут что багу исправили.
https://hibernate.atlassian.net/browse/HHH-4158
...
Рейтинг: 0 / 0
18.03.2015, 15:26
    #38908570
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
MarMot,
даже если удастся как-то пропихнуть такой запрос, все-таки, лучше формировать его динамически, чем привыкать использовать такие конструкции
Код: sql
1.
:idCategory is null or ent.idCategory = :idCategory


не скажу насчет pgsql, но некоторые сервера в плане запроса игнорируют индексы для полей из критерия, если идет сравнение с null, даже опосредованно (ent.idCategory для приведенного примера). Фактически, что с уточнением критерия, что без него (:idCategory is null) время выборки будет одинаковое.
Можно сказать, в данном случае hibernate на пару с pgsql учат вас, что не надо так писать программы :)
Используйте Criteria API
...
Рейтинг: 0 / 0
18.03.2015, 15:58
    #38908636
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
MarMot,
про null я конечно переборщил, просто первый взгляд зацепился за этот null, обычно с ним всегда проблемы с производительностью. Эта конструкция будет всегда неэффективной, даже при сравнении с ненулевым значением
Код: sql
1.
:idCategory = 2 or ent.idCategory = :idCategory

. Дело в том, что сервер сначала строит план запроса, потом использует переданный параметр. В плане такие критерии дают фуллскан по полю, даже если это поле PK, и запрос должен вернуть 1 запись
...
Рейтинг: 0 / 0
30.03.2015, 17:52
    #38921509
MarMot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
Проблема решилась переменой местами :idCategory is null и ent.idCategory = :idCategory
те получается такой запрос:
Код: java
1.
2.
3.
public interface ModelRepository extends PagingAndSortingRepository<Model, Integer>, JpaSpecificationExecutor<Model> {
@Query(value = "from models ent where ((ent.idCategory = :idCategory or :idCategory is null) and (ent.idType = :idType or :idType is null)) ")
Page<Model> findAllForTest(@Param("idCategory") Integer idCategory, @Param("idType") Integer idType, Pageable pageable);


Тогда переменная инициализируется правильным типом.

Либо передавать каждую переменную отдельно
Код: java
1.
2.
3.
public interface ModelRepository extends PagingAndSortingRepository<Model, Integer>, JpaSpecificationExecutor<Model> {
@Query(value = "from models ent where ((:idCategory is null or ent.idCategory = :idCategory_)and (:idType is null or ent.idType = :idType_)) ")
Page<Model> findAllForTest(@Param("idCategory") Integer idCategory, @Param("idCategory_") Integer idCategory_, @Param("idType") Integer idType, @Param("idType_") Integer idType_, Pageable pageable);
...
Рейтинг: 0 / 0
31.03.2015, 13:25
    #38922358
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
null в качестве параметра в запросе hibernate
MarMotSQL (postgres) отрабатывает корректно, для него сравнение с null всегда возвращает false.
Код: plsql
1.
select ent.* from models ent where null is null or null = id_category


так же это все работает в JDBC

Если тип данных был неизвестен, то это решалось приведением типа
Код: plsql
1.
select ent.* from models ent where $1::integer is null or $1::integer = id_category



Criteria API и QueryDSL выход, но сложные запросы описывать будет крайне сложно, да и наглядность опять же хромает по сразнению с SQL

Cравнение null с чем то еще всегда возвращает null. Можно не хило напороться. При использовании в where в том числе.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / null в качестве параметра в запросе hibernate / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]