Почему createNativeQuery не возвращает TypedQuery <T>? - PullRequest
0 голосов
/ 29 января 2019

Когда я пытаюсь выполнить TypedQuery типа, который является универсальным, я получаю предупреждение о непроверенном преобразовании типов из Eclipse.

Я использую здесь шаблон, потому что в наборе данных каждый год должен быть отделенв другую таблицу из-за временных ограничений на запросы и правки.В таблице хранятся данные за 118 лет (с 1900 года), и я хотел бы создать систему, которая может расширяться каждый год, используя Java Reflections API.Однако это означает, что до компиляции мои родительские классы не знали, с каким дочерним классом или таблицей они будут работать.

Вот пример кода, который вызовет неконтролируемое предупреждение, даже если я 'м, указав, какой тип все через TypedQuery.Код, который у меня есть, будет прекрасно скомпилирован и запущен в моей базе данных.

public class MyParentRepository<T extends MyParentPojo>
{
   @PersistenceContext
   private EntityManager em;

   private Class<T> tea;

   public MyParentRepository(Class<T> tea)
   {
      this.tea = tea;
   }

   public void giveWarning(int year)
   {
      String sql = String.format("SELECT * FROM mytable%d t", year);

      TypedQuery<T> resultSet = (TypedQuery<T>) em.createNativeQuery(sql, tea);
   }
}

Ожидаемый результат состоит в том, что, поскольку чай гарантированно будет создан с универсальным типом, так как он везде одинаковый и один раз созданизменить нельзя, поэтому компилятор должен понимать, что Entity Manager также будет возвращать TypedQuery типа.Однако это приводит к предупреждению о непроверенном типе, даже если оно гарантированно работает.

Я видел, как люди предлагали исправить предупреждение о непроверенном типе, переходя от запроса к TypedQuery, но это не помогает в этом случае,Есть ли способ избежать этого предупреждения, продолжая делать то, что я пытаюсь сделать?

В ответ на удаленный ответ я хотел бы кое-что прояснить.

em.createQuery(String)
em.createQuery(String, Class<T>)
em.createNativeQuery(String)
em.createNativeQuery(String, Class)
  1. Из этих опций первая принимает строку JPQL и возвращает общий запрос.
  2. Опция 2 принимает строку JPQL и определенный класс, представляющий строку таблицы, и возвращает TypedQuery.
  3. Вариант 3 принимает строку SQL и возвращает общий запрос.
  4. Вариант 4 принимает строку SQL и определенный класс, представляющий строку таблицы, и почему он возвращает общий запрос, а не TypedQuery?

Мне кажется, что если я даю ему POJO соответствующего типа, вариант 4 должен выяснить, как его сериализовать, как вариант 2 для меня.На самом деле это так, но он не устанавливает тип правильно, как вариант 2. Это неприемлемо с моей точки зрения, так как не каждый запрос SQL может быть представлен запросом JPQL, поэтому могут возникнуть ситуации, когда мне нужно использовать SQL, и я ожидал бы, что TypedQuery вернется.

Я решил предупреждение, которое получил, переключившись на вариант 2, но я все еще хотел бы знать ответ в случае, как я сказал, возникает ситуация, когдаЯ не могу использовать Вариант 2 в будущем.

1 Ответ

0 голосов
/ 02 февраля 2019

Это потому, что createNamedQuery возвращает Query, а не TypedQuery<T> даже в варианте с "типизированным результатом".https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html

...