Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como obter valor de coluna CLOB usando Spring Boot e JPA

Boa tarde,

Estou com dúvidas sobre como obter da melhor forma o valor de uma coluna CLOB usando Spring Boot e JPA.

Abaixo segue como eu fiz... A entidade Actor possui uma coluna que é um CLOB, seu conteúdo é um JSON que tende a crescer bastante. Implementei da forma abaixo , mas gostaria de saber se tem outro caminho melhor.

@Table(name = "actor")
@Entity(name = "Actor")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Actor implements Serializable {

    private static final long serialVersionUID = -4140863514505547976L;

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String msisdn;
    private String cpf;
    private String state;


     @Column(name="ACTOR_CONTEXT", columnDefinition="CLOB NOT NULL") 
     private String actorContext;

Repository

public interface ActorRepository extends JpaRepository<Actor, Long>{

    Actor findByMsisdn(String msisdn);

}

No Controller

    @GetMapping("/{msisdn}")
    public ResponseEntity<Actor> detalhar(@PathVariable String msisdn) {

        Actor actorReturned = actorRepository.findByMsisdn(msisdn);

        return ResponseEntity.ok(actorReturned);
    }

A API retorna o conteúdo do Actor como um JSON, porém gostaria que retornasse o atributo actorContext como um json também. No caso ele está retornando como uma grande string o conteúdo desse atributo.

3 respostas
solução!

Olá Aline, tudo bem?

Para obter o valor de uma coluna CLOB usando Spring Boot e JPA, você pode utilizar a classe java.sql.Clob. Essa classe representa um objeto CLOB em um banco de dados relacional.

No seu caso, você pode alterar o tipo do atributo actorContext para java.sql.Clob e fazer a conversão para String usando o método getSubString() da classe Clob. Veja como ficaria:

@Column(name="ACTOR_CONTEXT", columnDefinition="CLOB NOT NULL") 
private Clob actorContext;

E no método detalhar() do seu Controller:

@GetMapping("/{msisdn}")
public ResponseEntity<String> detalhar(@PathVariable String msisdn) throws SQLException, IOException {

    Actor actorReturned = actorRepository.findByMsisdn(msisdn);

    String actorContextJson = actorReturned.getActorContext().getSubString(1, (int) actorReturned.getActorContext().length());

    return ResponseEntity.ok(actorContextJson);
}

Dessa forma, o atributo actorContext será retornado como um JSON.

Espero ter ajudado e bons estudos!

Boa noite!

Obrigada Otávio! Ajudou muito :)

Por nada Aline, qualquer outra dúvida é só perguntar, bons estudos