我正在嘗試使用SpringBoot 和 JPArepository執行此 SQL 陳述句:
SELECT serie, nombre, activo FROM proveedor ORDER BY activo desc, nombre asc;
這句話非常適合對 PGADMIN 中的列進行排序,但是,在 springBoot 中,我只能對其中一個列進行排序,將其作為我的端點 API 中的引數傳遞,我的問題是如何將這個 SQL 陳述句傳遞給 springBoot 并獲取在同一個請求中對這兩列進行排序?
這是我的代碼:
物體:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
/**
* Class that models the entity Proveedores as table of the database
* @author ssc
*/
@Entity
@Table(name = "proveedor")
@Data
public class Provider {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int serie;
@Column(name = "nombre")
private String name;
@Column(name = "identificacion")
private String identification;
@Column(name = "corte_ultima_factura")
private String dueDateLastBill;
@Column(name = "valor_ultima_factura")
private Double amountLastBill; // null, it needs wrapper to execute as double is primitive and won't accept nullables.
@Column(name = "direccion")
private String address;
@Column(name = "telefono")
private String cellphone;
@Column(name = "ciudad")
private String city;
@Column(name = "pais")
private String country;
@Column(name = "email")
private String emailAddress;
@Column(name = "persona_contacto")
private String contactPerson;
@Column(name = "periodo_facturacion")
private String billingPeriod;
@Column(name = "activo")
private boolean status;
@Column(name = "inicio_operacion")
private String operationStart;
@Column(name = "email2")
private String emailAddress2;
@Column(name = "email3")
private String emailAddress3;
@Column(name = "email4")
private String emailAddress4;
@Column(name = "email5")
private String emailAddress5;
@Column(name = "valor_mora")
private double overdueAmount;
@Column(name = "valor_mora_inicial")
private double initialOverdueAmount;
@Column(name = "fecha_mora_inicial")
private String initialOverdueDate;
}
存盤庫:我不需要在此功能中使用分頁,因此我避免使用該選項
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.ssc.test.cb3.model.Provider;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
//import org.springframework.data.repository.PagingAndSortingRepository;
/**
* Class that extends to the repository for database management queries with table
proveedor
* @author ssc
*/
@Repository
public interface ProviderRepository extends JpaRepository<Provider, Integer>{
}
服務:
package com.ssc.test.cb3.service;
import com.ssc.test.cb3.model.Provider;
import com.ssc.test.cb3.repository.ProviderRepository;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
//import org.springframework.data.domain.Page;
//import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
/**
* Class to prepare the services to be dispatched upon request regarding Providers.
* @author ssc
*/
@Service
public class ProviderService {
@Autowired
private ProviderRepository providerRepository;
/**
* Function to get all customers
* @return a complete list of customers
*/
public List<Provider> getAllProviders() {
return providerRepository.findAll();
}
/**
* Functionality to create a new provider
* @param provider receives an objet Provider to be saved on the database
* @return the action of saving the provider in the database.
*/
public Provider createProvider(Provider provider){
return providerRepository.save(provider);
}
/**
* Service to sort the list of providers
* @param sortBy represents whether the list will be sort ASCending or DEScending
* @return List sorted in ascending or descending order
*/
public List<Provider> getSortingList(String column){
return providerRepository.findAll(Sort.by(Sort.Direction.DESC, column));
}
}
控制器:
package com.ssc.test.cb3.controller;
import com.ssc.test.cb3.model.Provider;
import com.ssc.test.cb3.service.ProviderService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Class to handle REST services and APIs for the provider's class
* @author ssc
*/
@RestController
@RequestMapping("/v1/providers")
@CrossOrigin(origins = "http://localhost:3000")
public class ProviderController {
@Autowired
private ProviderService providerService;
@GetMapping("/")
private ResponseEntity<List<Provider>> listProviders(){
return ResponseEntity.ok(providerService.getAllProviders());
}
@GetMapping("/{column}")
private ResponseEntity<List<Provider>> listSortedProviders(@PathVariable String column){
return ResponseEntity.ok(providerService.getSortingList(column));
}
@PostMapping("/provider")
private Provider saveProvider(@RequestBody Provider provider){
return providerService.createProvider(provider);
}
}
我將不勝感激這方面的任何幫助,或者如果有更好的方法可以做到這一點,我愿意嘗試。謝謝!
uj5u.com熱心網友回復:
如果用于排序的列始終相同,則不能從控制器傳輸它們:
public List<Provider> getSortingList() {
return providerRepository.findAll(Sort.by(Sort.Order.desc("activo"), Sort.Order.asc("nombre")));
}
如果您需要 api 客戶端自己設定排序順序,您可以這樣做:
//don't confuse, need this one
import org.springframework.data.domain.Sort;
//in controller
@GetMapping("/")
private List<Provider> listProviders(Sort sort){
return providerService.getAllProviders(sort);
}
//in service
public List<Provider> getAllProviders(Sort sort) {
if (sort.isUnsorted()) {
sort = Sort.by(Sort.Order.desc("activo"), Sort.Order.asc("nombre"));
}
return providerRepository.findAll(sort);
}
//then call it
curl http://localhost:8080/v1/providers?sort=activo,desc&sort=nombre,asc
uj5u.com熱心網友回復:
在介面類中,請多寫一個方法:
@Repository
public interface ProviderRepository extends JpaRepository<Provider, Integer>{
@Query("SELECT p.serie, p.name, p.status FROM Provider p ORDER BY p.status DESC,
p.name ASC")
public List<Object[]> sortByCondition();
}
然后你可以呼叫它。我希望這個答案對你有幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513223.html
標籤:爪哇弹簧靴休息弹簧MVC
上一篇:僅在執行批處理時如何執行建構式?
