Spring JPA NullPointerException в запросе с EntityManager

Я пытаюсь запустить Query с EntityManager, но каждый раз, когда я запускаю этот запрос в консоли JPA, я получаю исключение NullPointerException.

Но когда я запускаю этот запрос непосредственно в базе данных, он работает.

@Repository
@Slf4j
public class MyCredentialRepositoryImpl implements MyCredentialRepository {

  @PersistenceContext
  private EntityManager entityManager;

  @Override
  public Set<PublicKeyCredentialDescriptor> getCredentialIdsForUsername(String username) {
        Query query1 = this.entityManager.createQuery("SELECT UserEntity.id FROM UserEntity");
    return null;
  }
}

Вот трассировка стека, когда я получаю ошибку:

java.lang.NullPointerException: null
    at java.base/java.lang.String$CaseInsensitiveComparator.compare(String.java:1224) ~[na:na]
    at java.base/java.lang.String$CaseInsensitiveComparator.compare(String.java:1218) ~[na:na]
    at java.base/java.util.TreeMap.getEntryUsingComparator(TreeMap.java:374) ~[na:na]
    at java.base/java.util.TreeMap.getEntry(TreeMap.java:343) ~[na:na]
    at java.base/java.util.TreeMap.get(TreeMap.java:277) ~[na:na]
    at org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:45) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.findSQLFunction(SessionFactoryHelper.java:385) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.tree.IdentNode.getDataType(IdentNode.java:366) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:659) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.propertyRef(HqlSqlBaseWalker.java:1146) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2300) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:2241) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1507) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:589) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:317) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:265) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:272) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:604) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:716) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:113) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:368) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at com.sun.proxy.$Proxy109.createQuery(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at com.sun.proxy.$Proxy109.createQuery(Unknown Source) ~[na:na]
...
...

Я не могу найти ошибку и что может отсутствовать в моем коде

Всего 2 ответа


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

Первая часть - это изменение с UserEntity.id на id .

Вторая часть, которую вы спросили в комментариях, это то, что вам нужно иметь какой-то идентификатор из-за объединения, что я на самом деле даже не уверен, что это правда. Для ясности читателям, часть, помещенная в комментарии ОП,

SELECT CredentialEntity.id FROM CredentialEntity
INNER JOIN UserEntity ON UserEntity.id = CredentialEntity.user.id
WHERE UserEntity.username = :username

Исходя из этого, похоже, что у вас есть встроенный идентификатор, который является вашей проблемой. Необходимо указать имя встроенного поля вместе с полем внутри встраиваемого элемента, например

SELECT foo.user.id FROM CredentialEntity foo ...

Как прокомментировал @ searchengine27, я должен написать

Query query1 = this.entityManager.createQuery("SELECT id FROM UserEntity");

вместо того

Query query1 = this.entityManager.createQuery("SELECT UserEntity.id FROM UserEntity");

Это был более простой пример моей проблемы, потому что я хотел выполнить внутреннее соединение. Далее я опубликую свой старый код, а затем код, как он работает:

Query query = this.entityManager.createQuery(
        "SELECT CredentialEntity.id FROM CredentialEntity INNER JOIN UserEntity ON UserEntity.id = CredentialEntity.user.id WHERE UserEntity.username = :username");
    query.setParameter("username", username);

Этот кодекс работает:

Query query = this.entityManager.createQuery(
        "SELECT c.id FROM CredentialEntity c INNER JOIN UserEntity u ON u.id = c.user.id WHERE u.username = :username");

Есть идеи?

10000