[英]Spring MVC / Spring Roo Custom controller that returns JPA Query Data In JSON
我是Spring MVC和Roo的新手,我能夠非常輕松地部署Roo項目。 我創建了數據模型,並將其與Json控制器一起部署在mysql數據庫中。 一切運行正常,我可以通過寧靜的命令從數據庫中提取數據。 但是,我在理解如何創建自己的自定義JSON控制器方面遇到困難,在這里我可以從在一個表中定義的查詢中獲取特定數據。
我有三張桌子。 將兩者連接的患者,醫生和護理團隊。
Careteam表保存所有將患者與許多docotor和醫生與許多患者相關聯的記錄。
控制器的目標是向其傳遞參數PatientID,然后
從Careteam中選擇Doctors,其中PatientID = PatientID;
該查詢將為我返回該PatientID的所有醫生,然后將其包裝在JSON中,因此我可以通過一個寧靜的命令來獲取它。
這是我的代碼:
Careteam.java
package com.medroid.domain;
import javax.persistence.ManyToOne;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.tostring.RooToString;
import org.springframework.roo.addon.json.RooJson;
@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooJson
public class Careteam {
/**
*/
@ManyToOne
private Patient patient;
/**
*/
@ManyToOne
private Doctor doctor;
}
Doctor.java
package com.medroid.domain;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.tostring.RooToString;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.roo.addon.json.RooJson;
@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooJson
public class Doctor {
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "doctor")
private Set<DoctorMessages> DoctorMessages = new HashSet<DoctorMessages>();
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "doctor")
private Set<DoctorNotifications> DoctorNotifications = new HashSet<DoctorNotifications>();
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "doctor")
private Set<DoctorDiagnosis> DoctorDiagnosis = new HashSet<DoctorDiagnosis>();
@NotNull
@Column(name = "id", unique = true, insertable = false, updatable = false)
private int doctorID;
/**
*/
@NotNull
@Size(min = 8)
private String Password;
/**
*/
@NotNull
private String UserName;
/**
*/
@NotNull
@Size(min = 3)
private String FirstName;
/**
*/
@NotNull
@Size(min = 3)
private String LastName;
/**
*/
@NotNull
private String Specialty;
/**
*/
@NotNull
private String status;
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "doctor")
private Set<Careteam> attendingpatients = new HashSet<Careteam>();
}
Patient.java
package com.medroid.domain;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.jpa.activerecord.RooJpaActiveRecord;
import org.springframework.roo.addon.tostring.RooToString;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.OneToMany;
import javax.persistence.Column;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Max;
import org.springframework.roo.addon.json.RooJson;
@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooJson
public class Patient {
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient")
private Set<PatientMessages> PatientMessages = new HashSet<PatientMessages>();
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient")
private Set<PatientNotifications> PatientNotifications = new HashSet<PatientNotifications>();
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient")
private Set<PatientMedications> PatientMedications = new HashSet<PatientMedications>();
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient")
private Set<PatientAllergies> PatientAllergies = new HashSet<PatientAllergies>();
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient")
private Set<DoctorDiagnosis> Diagnosis = new HashSet<DoctorDiagnosis>();
/**
*/
@NotNull
@Column(name = "id", unique = true, insertable = false, updatable = false)
private int patientID;
/**
*/
@NotNull
private String UserName;
/**
*/
@NotNull
@Size(min = 8)
private String Password;
/**
*/
@NotNull
@Size(min = 3)
private String FirstName;
/**
*/
@NotNull
@Size(min = 3)
private String LastName;
/**
*/
@Size(min = 3)
private String MiddleName;
/**
*/
@NotNull
@Max(120L)
private int Age;
/**
*/
@NotNull
private String Sex;
/**
*/
@NotNull
private String DOB;
/**
*/
@NotNull
private String City;
/**
*/
@NotNull
private String Prov;
/**
*/
@NotNull
private String Bloodtype;
/**
*/
@NotNull
private String Status;
/**
*/
@NotNull
private String HC;
/**
*/
@NotNull
private String SymptomDesc;
/**
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "patient")
private Set<Careteam > AttendingDoctors = new HashSet<Careteam>();
}
我創建了一個名為JSONPatientDoctors的新控制器,並用Web MVC控制器包裝了該控制器,以便將其插入視圖。
JsonPatientDoctors.java
package com.medroid.domain;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import org.junit.runner.Request;
import com.medroid.domain.Careteam;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@RequestMapping("/jsonpatientdoctors/**")
@Controller
public class JsonPatientDoctors {
@RequestMapping(method = RequestMethod.POST, value = "{id}")
public void post(@PathVariable Long id, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
}
@RequestMapping(value ="/jsonpatientdoctors/GETPATIENTS", method = RequestMethod.GET)
public void GET() {
/* List<Careteam> result = Careteam.findAllCareteams();
System.out.println(result.get(0));*/
/*"SELECT o FROM Careteam o"*/
List<Careteam> careteam = Careteam.entityManager().createQuery("SELECT o FROM Careteam o where o.patient = '1'", Careteam.class).getResultList();
/* List<Careteam> careteam = Careteam.findAllCareteams(sortFieldName, sortOrder)*/
System.out.println(careteam.get(0));
}
@RequestMapping
public String index() {
return "jsonpatientdoctors/index";
}
}
我可以按ID提取患者數據,但問題是我只想選擇“患者ID =什么”的“醫生”字段,
我嘗試了“從Careteam o中選擇o.doctor,其中o。患者='1'”
但是我得到一個錯誤:
為TypedQuery [com.medroid.domain.Careteam]指定的類型與查詢返回類型[class com.medroid.domain.Doctor]不兼容; 嵌套異常是java.lang.IllegalArgumentException:為TypedQuery [com.medroid.domain.Careteam]指定的類型與查詢返回類型[class com.medroid.domain.Doctor]不兼容
我解決了問題,這是解決方案
@RequestMapping(value ="/jsonpatientdoctors/GetDoctorsByPatientID/{id}", method = RequestMethod.GET, headers = "Accept=application/json")
@ResponseBody
public ResponseEntity<String> showJson(@PathVariable("id") String id) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=utf-8");
try {
String ID = id;
ArrayList<String> DoctorJson = new ArrayList<String>();
List<Careteam> careteam = Careteam.entityManager().createQuery("SELECT o FROM Careteam o where o.patient =" + ID, Careteam.class).getResultList();
if (careteam == null) {
return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND);
}
for(int i=0; i < careteam.size(); i++){
DoctorJson.add(careteam.get(i).getDoctor().toJson());
}
return new ResponseEntity<String>(DoctorJson.toString(),headers,HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.