PROBLEMA
Hola chicos me puede ayudar a solucionar esto. Me he empecé a construir una API REST y tengo un problema al probar las direcciones URL que he hecho. Ejemplo: cuando envío la solicitud para obtener la lista de un objeto, la multa solicitud de trabajo, pero la sintaxis de datos devuelto por JSON es feo: me puse en matrices de resultados de anidado en lugar de una matriz global que contiene JSON objetos dentro de ella. Comprobar mi código por favor, tengo 2 entidades ahora que uno de ellos dependen de la otra, que solía @OneToMany para que las relaciones entre ellos y no pudo encontrar. Gracias por adelantado.
SOLUCIÓN
El problema es: mi consulta regresaba una lista de listas por defecto, así que tuve que modificar mi consulta agregando una llamada al constructor. Marque esta enlaces por favor: el uso de la nueva palabra clave en consulta HQL
También he añadido @JsonIgnore anotación a ignorar algunas propiedades en mis entidades para evitar su show. Ahora se muestran los datos como formateado como yo quiero: D gracias por su ayuda. Compruebe el nuevo resultado aquí
Actualizar
Hola de nuevo, me di cuenta hace poco, lo que es malo para usar @JsonIgnore anotación a prevenir algunas de las propiedades de ser de envío en la respuesta JSON, y la mejor manera de personalizar las propiedades de envío es utilizar la clase DTO. Gracias de nuevo kj007
entidad 1
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import lombok.Data;
@Data
@Table(name = "x_assureurs") // this is the table name in DB
@Entity(name = "Assureurs") // This tells Hibernate to make a table out of this class
public class Assureurs {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "n_assureur")
private String id;
@Column(name = "nom_assureur")
private String name;
@OneToMany(mappedBy="assureur",fetch = FetchType.LAZY)
private List<Contrats> contrats;
}
entidad 2
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.Data;
@Data
@Table(name = "contrats") // this is the table name in DB
@Entity(name = "Contrats") // This tells Hibernate to make a table out of this class
public class Contrats {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "num_contrat")
private String num;
@Column(name = "nom_police")
private String nomPolice;
@ManyToOne
@JoinColumn(name = "courtier")
private Courtiers courtier;
@ManyToOne
@JoinColumn(name = "assureur")
private Assureurs assureur;
}
Repositorio
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import tn.igase.gestdoc.models.entities.Assureurs;
// This will be AUTO IMPLEMENTED by Spring into a Bean called assureurRepository
@Repository
public interface AssureurRepository extends JpaRepository<Assureurs, String> {
// CONSTANTS
String FIND_ALL_BY_CONTRATS = "SELECT DISTINCT(contrat.assureur.id) as n_assureur, assureur.name \n"
+ " FROM Contrats contrat \n" + " JOIN Assureurs assureur ON contrat.assureur.id = assureur.id ";
String BY_ONE_COURTIER = "WHERE contrat.courtier.id = :idCourtier";
// QUERIES
@Query(FIND_ALL_BY_CONTRATS)
Iterable<Assureurs> findAllByContrats();
@Query(FIND_ALL_BY_CONTRATS + BY_ONE_COURTIER)
Iterable<Object> findAllByContratsAndCourtier(@Param("idCourtier") int idCourtier);
}
Servicio
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tn.igase.gestdoc.daos.AssureurRepository;
import tn.igase.gestdoc.models.entities.Assureurs;
@Service
public class AssureurService {
@Autowired
AssureurRepository assureurRepository;
public Iterable<Assureurs> findAllByContrats() {
return assureurRepository.findAllByContrats();
}
}
Controlador
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import tn.igase.gestdoc.models.entities.Assureurs;
import tn.igase.gestdoc.service.AssureurService;
import tn.igase.gestdoc.service.ContratService;
/**
*
* Assureur controller
*
* @author fre
*/
@RestController
@RequestMapping(path = "/api/assureurs")
public class AssureurController extends MainController {
@Autowired
private AssureurService assureurService;
/**
* Revert all assureurs that all have contrats
*
* @return list
*/
@RequestMapping(path = "/all", produces=MediaType.APPLICATION_JSON_VALUE)
public Iterable<Assureurs> getAll() {
// This returns a JSON or XML with the users
Iterable<Assureurs> assureurs = new ArrayList<>();
assureurs = assureurService.findAllByContrats();
return assureurs;
}
}
Su HQL actual lista de objetos volver es por eso que está viendo resultado como este.
usted puede o columnas entidad retorno o de identificación (tipo) de una query..not HQL o JPA llamado proyectado / personalizados.
A fin de lograr su lista de objetos que puede hacerlo a través de dos maneras ..
Como se HQL lista de objetos retrun puede analizar el objeto de acuerdo a su necesidad en su método de clase de servicio.
@Query(FIND_ALL_BY_CONTRATS) List<Object> findAllByContrats();
2. Uso DTO (que es el mejor camino a ella)
Paso 1: Crear DTO para columnas proyectadas que desea, asegúrese de constructure reúnen los parámetros necesarios de HQL ..for ejemplo ..
@Data
public class AssureursDTO {
private Long n_assureur;
private String name;
public AssureursDTO(Long n_assureur, String name) {
this.n_assureur = n_assureur;
this.name = name;
}
}
PASO 2: definir su HQL como esta pasando ruta del paquete completo de DTO, el suyo uso
String FIND_ALL_BY_CONTRATS = "SELECT DISTINCT new com.example.demomysql21.entity.AssureursDTO(assureur.id as n_assureur, assureur.name) \n"
+ " FROM Contrats contrat \n" + " JOIN Assureurs assureur ON contrat.assureur.id = assureur.id";
PASO 3: Ahora se le devolverá LISTA
@Query(FIND_ALL_BY_CONTRATS)
List<AssureursDTO> findAllByContrats();