如何使用 ManyToOne 关系从 mysql 数据库获取数据,没有主键实体



我在从不包含任何主键(弱实体)的表中获取数据时遇到问题。我有两张桌子 -DataPrescription.在Prescription中有一个主键 -token_idData包含 1 行以上,其中包含有关单个token_id的不同类型的信息。我该怎么做? 我无法向表添加任何主键。表格是提供给我的,所以我无法更改它。

我尝试并遵循了YouTube中的一些教程,但没有奏效。我还在 stackoverflow 中检查了一些答案,但这似乎不符合我的 api 结构。我完全被困住了。我尝试使用教程中显示的@MantToOne,然后为函数使用存储库,但这似乎不起作用。

我有两个模型类 - 数据.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
}

处方.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

两个存储库:数据存储库.java

public interface DataRepository extends JpaRepository<Data, String> {
public List<Data> findByPrescriptionTicket_no(String token);
}

处方库.java

public interface PrescriptionRepository extends JpaRepository<Prescription, String> {   
}

两个道类:数据道.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;
}
}

处方道.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;

}
}

我实际上将整个程序从简单的从两个表中获取数据转换为这个表,因此可能存在多个错误。我是这个概念的新手,但我必须在项目提交时这样做。 如果结果在数据列表中,那就太好了。

提前谢谢。

不能有没有主键的实体:

从规范:

2.4 主键和实体标识

每个实体都必须有一个主键。

必须定义主键 在作为实体层次结构根的实体类上或在 映射超类,它是所有(直接或间接)超类 实体层次结构中的实体类。主键必须是 在实体层次结构中只定义一次。

来源: https://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf?AuthParam=1561040540_b447233fdfd994fdb2338dd9407c4977

因此,您必须创建数据字段的主键。

如果它们的组合是唯一的,则可以创建如下组合键:

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
}

最新更新