Существует объект со свойством CLOB:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
@Column(columnDefinition = "clob")
@Lob
private String description;
//getters and setters here
}
Теперь я хотел бы иметь метод, который может возвращать только часть этого класса, поэтому вот класс проекции:
public interface PersonProjection {
String getLastName();
String getDescription();
}
и репозиторий:
@Repository
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
@Query(value = "select pe.last_name as lastName, pe.description from person pe where pe.last_name = :lastName", nativeQuery = true)
List<PersonProjection> findAllByLastName(@Param("lastName") String lastName);
}
Использование собственного запроса в этом примере не требуется, но в моем случае я хотел бы вызвать функцию Oracle в предложении where
(конкретный JSON_TEXTCONTAINS
)).
Теперь использование этого репозитория в контроллере вызывает:
Could not write JSON: Projection type must be an interface!; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Projection type must be an interface! (through reference chain: java.util.ArrayList[0]->com.sun.proxy.$Proxy103[\"description\"])
Кажется, что вызвано исключение, потому что запрос возвращает поле description
как экземпляр интерфейса java.sql.Clob
, но в классе проекции этополе определяется как String
.Исключение не выдается, когда класс сущности используется в качестве типа возврата из метода репозитория (и там description
также определяется как String
).
Полный проект для проверки этой проблемы можно найти здесь .