Esqueci de atualizar o tópico, desculpe, consegui resolver esse problema dos erros, está gerando a projeção corretamente, sem erros, porém não da forma que eu esperava.
Exemplo: Tenho uma pizza com 3 adicionais, o valor que eu queria gerar na projeção é o seguinte:
{
"id": 3,
"tamanho": "GRANDE",
"sabor": "Portuguesa",
"adicionais": [
{
"descricao": "Extra Bacon"
},
{
"descricao": "Sem Cebola"
},
{
"descricao": "Borda Recheada"
},
],
"valor": 48,
"tempo": 35
}
Porém ele está dividindo um resultado para cada adicional, ficando da seguinte forma:
{
"id": 3,
"tamanho": "GRANDE",
"sabor": "Portuguesa",
"adicionais": {
"id": 1,
"descricao": "Extra Bacon",
"valor": 3,
"tempo": 0
},
"valor": 48,
"tempo": 35
},
{
"id": 3,
"tamanho": "GRANDE",
"sabor": "Portuguesa",
"adicionais": {
"id": 2,
"descricao": "Sem Cebola",
"valor": 0,
"tempo": 0
},
"valor": 48,
"tempo": 35
},
{
"id": 3,
"tamanho": "GRANDE",
"sabor": "Portuguesa",
"adicionais": {
"id": 3,
"descricao": "Borda Recheada",
"valor": 5,
"tempo": 5
},
"valor": 48,
"tempo": 35
}
Minha classe Pizza está da seguinte forma:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = {"id"})
@ToString
@Entity
@Table(name = "pizza")
public class Pizza {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@ManyToOne
@JoinColumn(name = "idtamanho")
private Tamanho tamanho;
@NotNull
@ManyToOne
@JoinColumn(name = "idsabor")
private Sabor sabor;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "pizza_adicionais", joinColumns = @JoinColumn(name = "idpizza"), inverseJoinColumns = @JoinColumn(name = "idadicional"))
private Set<Adicional> adicionais;
private Long valor;
private Long tempo;
}
Meu Metamodel de pizza está da seguinte forma:
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Pizza.class)
public class Pizza_ {
public static volatile SingularAttribute<Pizza, Long> id;
public static volatile SingularAttribute<Pizza, Tamanho> tamanho;
public static volatile SingularAttribute<Pizza, Sabor> sabor;
public static volatile SetAttribute<Pizza, Adicional> adicionais;
public static volatile SingularAttribute<Pizza, Long> valor;
public static volatile SingularAttribute<Pizza, Long> tempo;
}
Minha classe de projeção está da seguinte forma:
@Getter
@Setter
@AllArgsConstructor
public class ResumoPizza {
private Long id;
private String tamanho;
private String sabor;
private Adicional adicionais;
private Long valor;
private Long tempo;
}
Minha classe RepositoryImpl:
public class PizzaRepositoryImpl implements PizzaRepositoryQuery {
@PersistenceContext
private EntityManager manager;
@Override
public Page<ResumoPizza> resumir(Pageable pageable) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<ResumoPizza> criteria = builder.createQuery(ResumoPizza.class);
Root<Pizza> root = criteria.from(Pizza.class);
criteria.select(builder.construct(ResumoPizza.class,
root.get(Pizza_.id),
root.get(Pizza_.tamanho).get(Tamanho_.descricao),
root.get(Pizza_.sabor).get(Sabor_.descricao),
root.join(Pizza_.adicionais),
root.get(Pizza_.valor),
root.get(Pizza_.tempo)));
TypedQuery<ResumoPizza> query = manager.createQuery(criteria);
adicionarRestricoesDePaginacao(query, pageable);
return new PageImpl<>(query.getResultList(), pageable, total());
}
private void adicionarRestricoesDePaginacao(TypedQuery<?> query, Pageable pageable) {
int paginaAtual = pageable.getPageNumber();
int totalRegistrosPorPagina = pageable.getPageSize();
int primeiroRegistroDaPagina = paginaAtual * totalRegistrosPorPagina;
query.setFirstResult(primeiroRegistroDaPagina);
query.setMaxResults(totalRegistrosPorPagina);
}
private Long total() {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = builder.createQuery(Long.class);
Root<Pizza> root = criteria.from(Pizza.class);
criteria.select(builder.count(root));
return manager.createQuery(criteria).getSingleResult();
}
}
O que será que fiz de errado para gerar o resultado dessa forma?