我有一个存储库,在这个接口中,我有一个方法想要返回ComemtarioEditalDto而不是ComemtarioEdital,但是当我调用此方法时,会引发异常,告诉我我没有转换器,我该如何转换以返回另一个类的实例?
import br.edu.ifrn.rederenova.dto.ComentarioEditalDto;
import br.edu.ifrn.rederenova.model.ComentarioEdital;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface ComentarioRepository extends CrudRepository<ComentarioEdital, Long>{
@Query(value = "SELECT c.id, c.texto, c.data_ultima_edicao, c.autor_id, " +
"c.data_criacao, c.edital_id, c.excluida FROM comentario_edital c INNER JOIN edital e ON e.id = c.edital_id " +
"WHERE (c.excluida = FALSE OR c.excluida IS NULL) AND e.numero = :numero ORDER BY c.data_criacao DESC",
nativeQuery = true)
public List<ComentarioEditalDto> findAllByEdital(@Param("numero") String nuEdital);
}
我删除了获取和集合
import br.edu.ifrn.rederenova.model.ComentarioEdital;
import br.edu.ifrn.rederenova.model.Edital;
import br.edu.ifrn.rederenova.model.Usuario;
import java.util.Calendar;
import java.util.List;
public class ComentarioEditalDto {
private Long id;
private String texto;
private Calendar dataCriacao;
private Calendar dataUltimaEdicao;
private List<ComentarioEdital> respostasComentario;
private Usuario autor;
private Edital edital;
private Boolean excluida;
}
我删除了获取和设置
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import java.util.Objects;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
@Entity
@SequenceGenerator(allocationSize = 1, initialValue = 1, name = "comentario_seq", sequenceName = "comentario_seq")
public class ComentarioEdital implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "comentario_seq")
private Long id;
@NotBlank(message = "Não deve estar vazio")
private String texto;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Calendar dataCriacao;
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(pattern = "dd/MM/yyyy")
private Calendar dataUltimaEdicao;
@OneToMany(cascade = {CascadeType.REMOVE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
@JoinTable(name = "respostas_comentario",
joinColumns = @JoinColumn(name = "pergunta_id"),
inverseJoinColumns = @JoinColumn(name = "resposta_id"))
private List<ComentarioEdital> respostasComentario;
@ManyToOne(fetch = FetchType.EAGER)
private Usuario autor;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
private Edital edital;
@JsonIgnore
private Boolean excluida;
}
有一点例外
org.springframework.core.convert.ConverterNotFoundException:未发现转换器能够从类型[org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap]转换为类型[br.edu.ifrn.rederenova.dto.ComentarioEditalDto]在org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321)~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]在org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:194)~[spring-core-5.0.7.RELEASE.jar:5.0.7.RELEASE]
只需将类“科曼塔里奥编辑”更改为
“接口”,如下所示:
public interface ComentarioEditalDto {
BigInteger getId();
String getTexto();
Calendar getDataCriacao();
Calendar getDataUltimaEdicao();
List<ComentarioEdital> getRespostasComentario(); --> attention to this ComentarioEdital
Usuario getAutor();
Edital getEdital();
Boolean isExcluida();
}
首先,不要删除 POJO 的获取器/设置器。其次,如果您想从存储库返回自定义对象,我建议您使用QueryDSL。您可以像这样使用它:存储库:
@Repository
public interface EntityRepository extends JpaRepository<Entity, Long>, EntityRepositoryCustom, QuerydslPredicateExecutor<Entity> {
}
自定义存储库:
public interface EntityRepositoryCustom {
List<EntityDTO> getEntityDTOsByCriteria(String arg0, String args1);
}
仓库实施:
public class EntityRepositoryImpl implements EntityRepositoryCustom {
@Autowired
private CardHolderRepository cardHolderRepository;
@Autowired
private EntityManager entityManager;
@Override
public List<EntityDTO> getEntityDTOsByCriteria(String arg0, String args1) {
final List<EntityDTO> projections = new JPAQuery(entityManager, jpqlTemplates)
.from(entity)
.orderBy(entity.somefield.asc())
.list(ConstructorExpression.create(EntityDTO.class, entity.somefield,
entity.someOtherfield));
return projections;
}
您需要在@Query
中返回dto
@Query(value = "SELECT new br.edu.ifrn.rederenova.dto.ComentarioEditalDto(c.id, c.texto, c.dataCriacao, c.dataUltimaEdicao, c.excluida) " +
"FROM ComentarioEdital c ....
SELECT新包。DTOClass
as选择新的br.edu.ifrn.rederenova.dto。Comentario编辑D至
ComentarioEditalDto中,使用传递给SELECT new br.edu.ifrn.rederenova.dto的相同参数定义构造函数
我正在使用sping-data-mongoDB。 我想在我的存储库中使用$or运算符。 这是我的疑问: 如何在@Query中使用$or,以便它可以匹配类型或名称并给我获取文档。请帮助。
我使用的是spring boot 1.5.2和spring boot数据redis 1.8。 我有两个@Id注释,一个用于JPA,另一个用于redis哈希。这里我想使用由mysql主键自动增量生成的JPA@Id值。 但我发现每次使用redis@Id注释时,redis中我的Id都会是另一个随机值,但我想使用mysql主键。 我的实体是这样的: 我的服务是这样的: 我得到了以下错误: redis的数据
我有两门课, 我的JSON文档是这样的, 我应该如何使用注释编写查询方法,通过userId和questionID查找PracticeQuestion。 谢谢你的建议。
我有一个使用Spring JPA的Spring项目。我有一个和的表,我已经将它们映射到中,如下所示: 品牌实体: 产品实体: 例如,我只想获取仅获取(品牌标识和品牌名称),而不获取产品,我如何仅获取品牌信息?非常感谢。 编辑1 我想访问所有品牌,但不访问每个品牌的。可能吗?还是我要创建另一个类? --编辑2-- 下面是使用 我想要的应该是和列,而不是@manytomy关系产生的
我一直试图理解HQL和JPQL之间的区别。冬眠留档在这里 建议写入选择是JPQL所必需的,但不是在HQL中。但是当我尝试在Spring数据JPA的查询注释中编写HQL或JPQL时,HQL和JPQL都可以工作。 我的理解是,既然查询注释是针对JPA的,为什么支持HQL? 或者让我换个说法- 我们可以在查询注释中编写HQL吗——Spring数据JPA支持两者吗?
功能注释:PEP-3107 背景:我是PyCharm用户,在Linux上拥有CPython 3.4x。我发现注释函数参数和返回类型很有帮助。当我使用这些方法时,IDE可以更好地提示我。 问题:对于自链接方法,如何注释方法返回值?如果我使用类名,Python会在编译时抛出一个异常: 示例代码: 作为一个技巧,如果我把放在类声明的前面,它就会起作用。然而,我不知道这种技术是否有意想不到的负面副作用。