No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Usar la anotaci贸n @Query con JPQL

17/25
Recursos

Aportes 7

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Si quisieran obtener solo determinados campos de la BD, por ejemplo, solo el nombre y el correo, pueden realizarlo de la siguiente forma:

// CustomerRepository
@Query(value = "SELECT c.name, c.email FROM CustomerEntity c WHERE c.phoneNumber = :phone")
    List<Object[]> findByPhoneOnlyName(@Param("phone") String phone);
// CustomerService
public List<Object[]> findByPhoneOnlyName(String phone) {
        return repository.findByPhoneOnlyName(phone);
 }
//CustomerController
 @GetMapping("onlyName/{phone}")
    public ResponseEntity<CustomerEntity> geyByPhoneOnlyName(@PathVariable String phone) {
        CustomerEntity customer = new CustomerEntity();
        for(Object[] obj : customerService.findByPhoneOnlyName(phone)) {
            customer.setName(obj[0].toString());
            customer.setEmail(obj[1].toString());
        }
        return ResponseEntity.ok(customer);
    }

Existen otras formas para hacer ese tipo de consulta, yo solo probe esta, les dejo un enlace de la info https://www.objectdb.com/java/jpa/query/jpql/select

Si alguno esta teniendo algun error con la consulta al momento de consumir el servicio de getByPhone con alguna otra herramienta, tengan en cuenta que en el request deben representar los espacios en el numero de telefono con el caracter especial 鈥%20鈥 que representa un espacio, quedando la consulta de esta forma:

GET http://localhost:8080/api/customers/phone/(826)%20607-2278

Solo un peque帽o aporte, hasta este punto siempre hemos usado

return ResponseEntity.ok(this.customerService.findByPhone(phone));

Bajo estos ejemplos esta 鈥渂ien鈥 pero en un ambiente productivo en donde lo mas seguro es que vayas a escribir validaciones, no queremos llamar a la base de datos tantas veces como validaciones tengamos. Lo recomendado es:

CustomerEntity customer = this.customerService.findByPhone(phone)
return ResponseEntity.ok(customer)

De esta forma solo hacemos un llamado a la base de datos y podemos hacer cuantas validaciones queramos sin afectar el rendimiento de nuestra app

Es buena practica terminar el nombre del metodo con el tipo de sentencia si es SQL O JPQL, y @Query(), admite otro parametro nativeQuery que recibe un valor boolean, para indicarle si es true estamos usando SQL y false PQL

@Query(nativeQuery = false,
			value = "SELECT e "
					+ "FROM EmployeeEntity e, DepartmentEntity d, JobEntity j, LocationEntity l, CountryEntity c, RegionEntity r "
					+ "WHERE e.jobEntity.jobId = j.jobId "
					+ "AND e.depEntity.departmentId = d.departmentId "
					+ "AND d.locationEntity.locationId = l.locationId "
					+ "AND l.countryEntity.id = c.id "
					+ "AND c.region.id = r.id "
					+ "AND e.salary > :salary "
					+ "AND e.commissionPct IS NOT NULL "
					+ "ORDER BY salary ASC ")
	
	public List<EmployeeEntity> searchInTablesJpql(@Param("salary")Double salary);
Listo 鉁

Si solo quiero proyectar algunas columnas de mi tabla con JPQL una manera es creando un constructor en el entity, con solo los atributos que quiera proyectar, y en el query en la parte donde se especifica las columnas crear una instancia del constructor de la clase


	@Query(nativeQuery = false,
			value = "SELECT new ParamEntity(p.id, p.name, p.value) "
					+ "FROM ParamEntity p "
					+ "WHERE p.parentId = (SELECT parent.id FROM ParamEntity parent where parent.name = :name ) "
					+ "AND p.status = :status "
					+ "ORDER BY p.name ASC ")
	public List<ParamEntity> findChildsOfParentId(@Param("name") String id, @Param("status") Integer status);
public ParamEntity(Integer id, String name, String value) {
		this.id = id;
		this.name = name;
		this.value = value;
	}