尝试在Spring数据中将投影用于具有Clob类型属性的实体时发生异常

时间:2018-12-18 16:04:14

标签: java oracle spring-boot spring-data-jpa spring-data

有一个具有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

1 个答案:

答案 0 :(得分:0)

您可以在SQL中将Clob解析为varchar。 例如:dbms_lob.substr(pe.description,4000,1)作为说明