Неожиданный токен «?» во время запроса JPA?

#jakarta-ee #jpa #java-ee-7

#джакарта-ee #jpa #java-ee-7

Вопрос:

Я пытаюсь запросить список ключей Api в моей базе данных db2.

Проблема в том, что фактический запрос, который выдает JPA, содержит дополнительное поле сравнения, которое вызывает синтаксическую ошибку.

Ошибка:

 [ERROR   ] CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "getApikeys" on bean "BeanId(WebApiConsole#WebApiConsole.war#ConsoleREST, null)". Exception data: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140222-22988a5): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.ibm.db2.jcc.am.SqlSyntaxErrorException: An unexpected token "?" was found following "KEYS t1 WHERE ( LIKE".  Expected tokens may include:  "IN".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.16.53
Error Code: -104
Call: SELECT t1.APIKEYID, t1.APIKEY, t1.CREATEDAT, t1.PROJECTID FROM DB2ADMIN.PROJECTS t0, DB2ADMIN.APIKEYS t1 WHERE ( LIKE ? AND (t0.PROJECTID = t1.PROJECTID))
    bind => [1 parameter bound]
Query: ReadAllQuery(name="Apikey.queryAllByProject" referenceClass=Apikey sql="SELECT t1.APIKEYID, t1.APIKEY, t1.CREATEDAT, t1.PROJECTID FROM DB2ADMIN.PROJECTS t0, DB2ADMIN.APIKEYS t1 WHERE ( LIKE ? AND (t0.PROJECTID = t1.PROJECTID))")
  

Выдержка. Я не знаю, почему появляется знак вопроса.

 SELECT t1.APIKEYID, t1.APIKEY, t1.CREATEDAT, t1.PROJECTID FROM DB2ADMIN.PROJECTS t0, DB2ADMIN.APIKEYS t1 WHERE ( LIKE ? AND (t0.PROJECTID = t1.PROJECTID))
  

Именованный запрос:

 @NamedQuery(name    = "Apikey.queryAllByProject",
            query   = "SELECT k FROM Apikey k WHERE k.project LIKE :project")
  

Наконец, вот код приложения jax-rs:

 Project p = (Project) em.createNamedQuery("Project.queryProjectById")
        .setParameter("projectid", Integer.parseInt(projectid)).getResultList().get(0);
List<JsonObject> apikeys = em.createNamedQuery("Apikey.queryAllByProject")
                        .setParameter("project", p)
                        .getResultList();
  

Как ни странно, все получится, если я изменю его на следующее:

 @NamedQuery(name    = "Apikey.queryAllByProject",
            query   = "SELECT k FROM Apikey k WHERE k.project.projectid LIKE :projectid")


List<JsonObject> apikeys = em.createNamedQuery("Apikey.queryAllByProject")
                        .setParameter("projectid", 10000)
                        .getResultList();
  

Комментарии:

1. Вы не можете использовать «нравится» при сравнении сущностей.

Ответ №1:

LIKE оператор не может использоваться для сравнения двух объектов, нет способа выразить это на языке SQL. Вам нужно будет извлечь их в соответствии с соответствующим идентификатором или по какому-либо другому критерию. Смотрите также эту таблицу, в которой перечислены операторы JPA и их возможности.

Комментарии:

1. Из-за строки «(t0.PROJECTID = t1.PROJECTID)» я думал, что JPA автоматически использует столбцы id / fk. Спасибо.