Spring Data JPA отображает собственный результат запроса в не-Entity POJO, не в состоянии создать экземпляр класса не-сущности pojo - PullRequest
0 голосов
/ 27 сентября 2019

Мои сущности связаны друг с другом, но таким образом, что я не мог использовать JPQL.Я был вынужден использовать родной SQL.Теперь я хочу отобразить эти результаты в ValueObject.Чтобы было понятно, я не хочу получать список массивов объектов (List).У меня есть 6 объектов, из которых мне нужно только несколько столбцов.Кто-нибудь может дать мне пример того, как реализовать такое отображение из собственного запроса?

Я пытался создать экземпляр репозитория, но получая ошибку, как показано ниже, я пытался с аннотацией @Repository, помещая чуть выше классу,Это не сработало.Потом я тоже попробовал с @Service.Не повезло.

В чем может быть причина?Поскольку мы не можем использовать @Entity, потому что для этого потребуется @Id, которого у нас не может быть, так как это не фактический класс сущности.Ниже приведен фактический класс DTO, в котором мы определили запрос:

@SqlResultSetMapping(
  name = "findAllDataMapping",
  classes = @ConstructorResult(
    targetClass = MyVO.class,
    columns = {
      @ColumnResult(name = "userFirstName"),
      @ColumnResult(name = "userLastName"),
      @ColumnResult(name = "id"),
      @ColumnResult(name = "packageName")
    }
  )
)

@NamedNativeQuery(name = "findAllDataMapping",
  resultClass = MyVO.class,
  query = "SELECT u.first_name as userFirstName, " +
            " u.last_name as userLastName, " +
            " i.id as id, " +
            " s.title as packageName, " +
          "FROM " +
            "    invoice as i " +
          "JOIN user as u on i.user_id=u.id " +
          "LEFT JOIN subscription_package as s on i.subscription_package_id=s.id " +
          "where  u.param1=:param1 and i.param2=:param2" +
)

public class MyVO {
    private String userFirstName;
    private String userLastName;
    private Long id;
    private String packageName;

    //Default constructor
    public MyVO () {}

    //Parameterised constructor
    public MyVO (String userFName, String userLName, Long id, String packageName) {
        this.userFirstName = userFName;
        this.userLastName = userLName;
        this.id = id;
        this.packageName = packageName;
    }

    // getters & setters
}

В моем модуле jpa-репозитория:

//MyRepository interface
@Repository
public interface MyRepository extends JpaRepository<MyVO, Long> {
    @Query(nativeQuery = true)
    List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}

Экземпляр MyVO должен автоматически быть создан.А в основном классе, то есть в классе обслуживания, я должен иметь возможность выполнить этот запрос и получить результат в виде списка, вызвав метод репозитория.

Причина:

java.lang.IllegalArgumentException: не управляемый тип: class MyVO

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

Я попытался с аннотацией @Repository, поместив чуть выше в класс.Это не сработало.Потом я тоже попробовал с @Service.Не повезло.
В чем может быть причина?Поскольку мы не можем использовать @Entity, потому что для этого потребуется @Id, которого у нас не может быть, так как это не фактический класс сущности

...