Spring JPA - "java.lang.IllegalArgumentException: тип проекции должен быть интерфейсом!"(используя собственный запрос) - PullRequest
2 голосов
/ 19 марта 2019

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

java.lang.IllegalArgumentException: тип проекции должен быть интерфейсом!

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

Мой код похож на приведенный ниже (Извините, не могу вставить оригинальныйодин из-за политики компании).

Объект:

@Getter
@Setter
@Entity(name = "USER")
public class User {

    @Column(name = "USER_ID")
    private Long userId;

    @Column(name = "USER_NAME")
    private String userName;

    @Column(name = "CREATED_DATE")
    private ZonedDateTime createdDate;
}

Проекция:

public interface UserProjection {

    String getUserName();

    ZonedDateTime getCreatedDate();
}

Репозиторий:

@Repository
public interface UserRepository extends CrudRepository<User, Long> {

    @Query(
            value = "   select userName as userName," +
                    "          createdDate as createdDate" +
                    "   from user as u " +
                    "   where u.userName = :name",
            nativeQuery = true
    )
    Optional<UserProjection> findUserByName(@Param("name") String name);
}

Я используюSpring Boot 2.1.3 и Hibernate 5.3.7.

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

У меня была такая же проблема с очень похожей проекцией:

public interface RunSummary {

    String getName();
    ZonedDateTime getDate();
    Long getVolume();

}

Я не знаю почему, но проблема в ZonedDateTime. Я переключил тип getDate() на java.util.Date, и исключение ушло. Вне транзакции я преобразовал Date обратно в ZonedDateTime, и мой нисходящий код не был затронут.

Я понятия не имею, почему это проблема; если я не использую проекцию, ZonedDateTime работает "из коробки". Тем временем я выкладываю это как ответ, потому что он должен быть в качестве обходного пути.

0 голосов
/ 19 марта 2019

Вы объявили userId поле как Long в сущности, но в UserProjection getUserId тип возврата метода - String.что не соответствует, так что измените

String getUserId();

на

Long getUserId();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...