有一个具有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);
}
在此示例中无需使用本机查询,但就我而言,我想在where
子句(具体为JSON_TEXTCONTAINS
)中调用Oracle函数。
现在在控制器中使用此存储库会导致:
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
)。
可以完成项目来检查此问题,here。
答案 0 :(得分:0)
您可以在SQL中将Clob解析为varchar。 例如:dbms_lob.substr(pe.description,4000,1)作为说明