簡體   English   中英

Spring MVC / Spring Roo Custom控制器,以JSON返回JPA查詢數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM