我在从不包含任何主键(弱实体)的表中获取数据时遇到问题。我有两个表-Data
和Prescription
。在Prescription
中有一个主键-token_id
,而Data
包含多于1行,其中包含有关单个token_id
的不同类型的信息。我该怎么做?
我无法将任何主键添加到表中。该表是提供给我的,所以我不能更改它。
我尝试并遵循了YouTube中的一些教程,但是没有成功。我还检查了stackoverflow中的一些答案,但这似乎与我的api结构无关。我完全被困住了。我曾尝试使用本教程中显示的@MantToOne
,然后将存储库用于函数,但这似乎不起作用。
我有两个模型类- Data.java
@Repository
@Entity
@Table(name="data")
public class Data {
@Column(name="ticket_no")
private String ticket_no;
@Column(name="type")
String type;
@Column(name="unit")
private String unit;
@Column(name="value")
private float value;
@ManyToOne
private Prescription pres;
//getters and setters
}
Prescription.java
@Entity
@Table(name="prescriptions")
public class Prescription {
@Id
@Column(name="ticket_no")
private String ticket_no;
@Column(name="description")
String description;
@Column(name="download_link")
private String download_link;
//getters and setters
两个存储库:DataRepository.java
public interface DataRepository extends JpaRepository<Data, String> {
public List<Data> findByPrescriptionTicket_no(String token);
}
PrescriptionRepository.java
public interface PrescriptionRepository extends JpaRepository<Prescription, String> {
}
两个Dao类:DataDao.java
@Service
public class DataDao {
@Autowired
DataRepository datarepo;
public List<Data> findOne(String token) {
List<Data> meddat=new ArrayList<>();
datarepo.findByPrescriptionTicket_no(token).forEach(meddat::add);
return meddat;
}
}
PrescriptionDao.java
@Service
public class PrescriptionDao {
@Autowired
PrescriptionRepository presrepo;
public Prescription findOne(String token) {
return presrepo.findOne(token);
}
}
控制器类
@RestController
@RequestMapping(value = "/rest/users")
public class MainController {
@Autowired
DataDao datadao;
@Autowired
PrescriptionDao presdao;
@Autowired
ProcessData pd;
@GetMapping("/persons")
public String loadPersons(@RequestParam("access_token") String access_token) throws ParseException{
String decode_token = pd.testDecodeJWT(access_token);
String token = pd.jsondata(decode_token);
String pres=presdao.findOne(token).toString();
List<Data> med= datadao.findOne(token);
String tot_data= "{"+"\"medical_data\":"+med+","+"\"hb_prescription\":"+pres+"}";
return tot_data;
}
}
我实际上将整个程序从从两个表中简单地获取数据转换为这个程序,因此可能会有多个错误。我是这个概念的新手,但是我必须在提交项目时这样做。 如果结果在“数据列表”中,那就好了。
谢谢。
答案 0 :(得分:1)
没有主键就不能拥有实体:
根据规范:
2.4主键和实体标识
每个实体必须有一个主键。
必须定义主键 在作为实体层次结构根源的实体类上或 映射的超类,它是所有的(直接或间接)超类 实体层次结构中的实体类。主键必须是 在实体层次结构中仅定义一次。
因此,您必须创建数据字段的主键。
如果它们在组合中是唯一的,则可以创建这样的复合键:
public class DataKey implements Serializable {
@Id
private String ticket_no;
@Id
String type;
@Id
private String unit;
@Id
private float value;
// getters, setters, equals and hashCode implementations
}
@Entity
@Table(name="data")
@IdClass(DataKey.class)
public class Data {
@Id
@Column(name="ticket_no")
private String ticket_no;
@Id
@Column(name="type")
String type;
@Id
@Column(name="unit")
private String unit;
@Id
@Column(name="value")
private float value;
@ManyToOne
private Prescription pres;
//getters and setters
}