Как правильно создать запрос Spring JPA с использованием HQL? - PullRequest
0 голосов
/ 01 сентября 2018

Если я запускаю этот запрос на моей БД, он работает нормально:

UPDATE Products SET in_Stock = (quantity_in_stock is not null and quantity_In_Stock > 0) WHERE id = 1 and deleted_At is NULL;

Но я использую Spring JPA и пытаюсь создать такой же запрос, как этот:

@Modifying
    @Query("UPDATE Product p SET p.inStock = (p.quantityInStock is not null) WHERE p.id = :productId and p.deletedAt is NULL")
    int updateInStock(@Param("productId") Long productId);

Проблема в том, что когда я пытаюсь запустить свое приложение, я получаю эту ошибку:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: is not null [UPDATE ca.edooby.edoobyapi.model.Product p SET p.inStock = (p.quantityInStock is not null) WHERE p.id = :productId and p.deletedAt is NULL]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:272) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    ... 92 common frames omitted

Если я жестко закодирую значение, подобное этому, оно отлично работает:

@Modifying
@Query("UPDATE Product p SET p.inStock = false WHERE p.id = :productId and p.deletedAt is NULL")
int updateInStock(@Param("productId") Long productId);

Я пытался выяснить, что я сделал неправильно, но я не вижу этого. Я что-то упускаю?

Спасибо!

...