gpt4 book ai didi

java - 如何使用 Repository Hibernate 和 Pageable 与 Java Spring 进行参数搜索?

转载 作者:行者123 更新时间:2023-12-01 17:35:45 25 4
gpt4 key购买 nike

我刚刚学会了如何使用 Repository Java 进行分页(我有一个 BBDD MySQL)。我基本上将 DAO 与我的模型 (pregunta) 结合使用,并将模型转换为 DTO (preguntaDTO)。



public Page<PreguntaDTO> getAllPreguntasPorPagina(Pageable pageable){

return preguntaRepository.findAll(pageable).map(PreguntaDTO::fromEntity);

}

我的 Controller 接收分页参数。


@GetMapping("/listadoPreguntasPaginadas")

public ResponseEntity<Page<PreguntaDTO>> listadoPreguntasPaginadas(

@RequestParam(defaultValue = "0") int page,

@RequestParam(defaultValue = "10") int size,

@RequestParam(defaultValue = "pregunta") String order,

@RequestParam(defaultValue = "true") boolean asc

) {

Page<PreguntaDTO> preguntaDTOpaginada= preguntaService.listadoPreguntasPageables(PageRequest.of(page, size, Sort.by(order)));

return new ResponseEntity<Page<PreguntaDTO>>(preguntaDTOpaginada, HttpStatus.OK);

}

但是现在,我需要在 JQUERY 中使用参数(文本和 id)。我会尽力解释得更好。我的模型是:


@Entity

@Table (name="preguntas")

@EntityListeners(AuditingEntityListener.class) // sin esto no genera fecha automatica

@Getter

@Setter

public class Pregunta implements Serializable {

private static final long serialVersionUID = 5191280932150590610L;



@Id // definimos clave primaria

@GeneratedValue(strategy=GenerationType.AUTO) // que se genere de forma automatica y crezca

private Long id;



@Temporal(TemporalType.TIMESTAMP)

@LastModifiedDate

private Date createAt;



@NotBlank // que no este campo en blanco, validar documento

@NotNull(message = "Nombre no puede ser nulo")

private String pregunta;

private Boolean activa=true;

private Long deEnfermedadById;//ID de Enfermedad

private Long createdById;//ID de usuario

private Boolean denunciado=false;

private String aux="Campo auxiliar sin usar";

}

我的搜索除了可分页之外,还必须返回我的所有问题(pregunta),这些问题具有:

  • 在带有 ID (deEnfermedadById :number) 的 deEnfermedadById 字段中,并且,
  • 字段 pregunta 中的文本 ( cadena: string) ( type, pregunta :string)

我知道如何使用实体管理查找此类列表,但在这里我不知道如何使用可分页。

上面你可以看到我是如何做到的。


public List<Pregunta> listadoPreguntasByIdEnfermedad(Long idEnf, String cadena) {

List<Pregunta> lista = new ArrayList<>();

String sql = "select * from sanihelp.preguntas where "

+ "de_enfermedad_by_id = ?";

if (cadena != null) {

sql = sql.concat(" and pregunta like ? ");

};

try {

Query query = em.createNativeQuery(sql);

int indice=1;

query.setParameter(indice , idEnf);

if (cadena != null) {

query.setParameter(++indice, "%" + cadena + "%");

}

for (Object o : query.getResultList()) {

Object[] objeto = (Object[]) o;

Pregunta modelo = new Pregunta();

modelo.setId(((BigInteger) objeto[0]).longValue()); modelo.setActiva(Boolean.getBoolean(String.valueOf(objeto[1])));

modelo.setAux(String.valueOf(objeto[2]));

modelo.setCreateAt((java.util.Date)objeto[3]);

modelo.setCreatedById(((BigInteger) objeto[4]).longValue());

modelo.setDeEnfermedadById(((BigInteger) objeto[5]).longValue()); modelo.setDenunciado(Boolean.getBoolean(String.valueOf(objeto[6])));

modelo.setPregunta(String.valueOf(objeto[7]));

lista.add(modelo);

}

} catch (Exception e) {

System.out.println("excepcion lanzada" + e);

}

return lista;

}

你怎么看,我有点卡住了。使用实体管理,我无法进行分页,使用存储库 Java,我不知道如何向可分页方法添加一些参数( id 和 text )

感谢您的帮助。

:-)

以上是界面的一些额外信息。


package com.uned.project.sanitaUned.repository;



import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.stereotype.Repository;



import com.uned.project.sanitaUned.model.Pregunta;



@Repository

public interface PreguntaRepository extends JpaRepository<Pregunta, Long> {



}

扩展为:


*/

@NoRepositoryBean

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {



以及可分页的扩展


@NoRepositoryBean

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {



/**

* Returns all entities sorted by the given options.

*

* @param sort

* @return all entities sorted by the given options

*/

Iterable<T> findAll(Sort sort);



/**

* Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.

*

* @param pageable

* @return a page of entities

*/

Page<T> findAll(Pageable pageable);

}

我尝试这样做:




@Repository

public interface PreguntaRepository extends JpaRepository<Pregunta, Long> {



/* */



@Query ("select * from sanihelp.preguntas where de_enfermedad_by_id = :de_enfermedad_by_id")

Page <Pregunta> findAllWithFields(Pageable pageable , @Param ("de_enfermedad_by_id") long de_enfermedad_by_id );



}

但是它不起作用,当我开始出现下一个错误时,它在服务器中失败了。




Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

2020-04-07 18:16:44.091 ERROR 8424 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed



org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'preguntaController': Unsatisfied dependency expressed through field 'preguntaService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'preguntaService': Unsatisfied dependency expressed through field 'preguntaDAO'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'preguntaDAO': Unsatisfied dependency expressed through field 'preguntaRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'preguntaRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract org.springframework.data.domain.Page com.uned.project.sanitaUned.repository.PreguntaRepository.findAllWithFields(org.springframework.data.domain.Pageable,long)!

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]

at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]



最佳答案

我的 friend 阿古斯丁·利东·马丁内斯给了我答案。谢谢。


@Repository
public interface PreguntaRepository extends JpaRepository<Pregunta, Long> {

@Query ("SELECT p FROM Pregunta p WHERE p.deEnfermedadById = :de_enfermedad_by_id")
Page <Pregunta> findAllWithFieldsContaining ( Pageable pageable, @Param ("de_enfermedad_by_id") Long de_enfermedad_by_id );
}

我不知道当你使用 HQL 时与 SQL 不一样。您必须使用模型 Pregunta,而不是表名称 sanihelp.pregunta,就像我一直在做的那样。谢谢。

工作正常:

1) 我的 Controller 。


@GetMapping("/listadoPreguntasPaginadasConIdEnfermedad")
public ResponseEntity<Page<PreguntaDTO>> listadoPreguntasPaginadasConIdEnfermedad(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "pregunta") String order,
@RequestParam(defaultValue = "true") boolean asc,
@RequestParam(defaultValue = "") Long idEnfermedad
) {
Page<PreguntaDTO> preguntaDTOpaginada= preguntaService.listadoPreguntasPaginadasConIdEnfermedad(
PageRequest.of(page, size, Sort.by(order)), idEnfermedad);

return new ResponseEntity<Page<PreguntaDTO>>(preguntaDTOpaginada, HttpStatus.OK);
}

我的服务:

    @Override
public Page<PreguntaDTO> listadoPreguntasPaginadasConIdEnfermedad (Pageable pageable, Long idEnfe) {
return preguntaDAO.getAllPreguntasPorPaginaYCampos(pageable, idEnfe);
}

米道:

    /* obtener lista de todas las preguntas tabla PAGEABLE con mapeo incluido de page  y campos         */
public Page<PreguntaDTO> getAllPreguntasPorPaginaYCampos (Pageable pageable, Long enfermedad){
return preguntaRepository.findAllWithFieldsContaining(pageable, enfermedad).map(PreguntaDTO::fromEntity);
}

在我的问题中你有更多需要的类(class)。再次感谢

我在我的 PreguntaRepository 中使用了这个:

@Query ("SELECT p FROM Pregunta p WHERE p.deEnfermedadById = :de_enfermedad_by_id and p.pregunta LIKE %:texto%") 
Page <Pregunta> findAllWithFieldsContaining ( Pageable pageable, Long de_enfermedad_by_id, String texto );
}

没有@Param ("de_enfermedad_by_id") @Param ("texto") 也可以。

关于java - 如何使用 Repository Hibernate 和 Pageable 与 Java Spring 进行参数搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61044831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com