Hibernate - 根据输入的ID删除行...怎么样?

时间:2016-02-10 03:55:13

标签: java hibernate

我正在尝试删除带有ID的行,该行显示在文本字段上,我收到错误:“无法提取ResultSet”。我试图以两种方式做到这一点,但它们都没有工作......我怎么能正确地做到这一点?

第一种方式:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("clinic");
    EntityManager entityManager = entityManagerFactory.createEntityManager();

    entityManager.getTransaction().begin();

    Patient patient = new Patient();
    patient.setPID(infoPIDField.getText());

    Query query = entityManager.createQuery("FROM Patient WHERE idpatient = :idpatient", Patient.class);
    query.setParameter("idpatient", patient.getPID());

    patient = (Patient) query.getResultList().get(1);

    entityManager.remove(patient);
    entityManager.getTransaction().commit();


    entityManager.close();
    entityManagerFactory.close();

第二种方式(错误:无法输入更新/删除查询):

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("clinic");
    EntityManager entityManager = entityManagerFactory.createEntityManager();

    entityManager.getTransaction().begin();

    Patient patient = new Patient();
    patient.setPID(infoPIDField.getText());

    Query query = entityManager.createQuery("DELETE Patient WHERE idpatient = :idpatient", Patient.class);
    query.setParameter("idpatient", patient.getPID());

    int result = query.executeUpdate();


    entityManager.getTransaction().commit();


    entityManager.close();
    entityManagerFactory.close();

病人:

@Entity
@Table(name = "patient")
public class Patient {

@Id
public String PID;

public String getPID() {
    return PID;
}
public void setPID(String pID) {
    PID = pID;

3 个答案:

答案 0 :(得分:0)

这个

 patient = (Patient) query.getResultList().get(1);

应该是

 patient = (Patient) query.getResultList().get(0);

假设根据id查找只返回一行。

更好地检查返回的行数,可能为零。

答案 1 :(得分:0)

第一种方式应该是

patient = (Patient) query.getResultList.get(0);

第二种方式应该是:

 Query query = entityManager.createQuery("DELETE Patient as p WHERE p.idpatient = :idpatient");

因为您正在使用HQL并且它作为Java对象工作,所以您必须在Patient对象中引用属性idpatient。

我希望这些信息可以帮到你。

祝你好运。

答案 2 :(得分:0)

如果您只是按ID删除实体,我不认为在您不必要地选择实体时,第一种方式是可行的。

第二种方式不太便携。 Iirc,HQL / JPQL中的批量删除/更新仅在更高版本的JPA / Hibernate中可用,并且这种批量删除/更新可能会触发第一级缓存的刷新和失效/刷新(如果它是真的,则不能很清楚地记得但是第一级缓存点:P)

还有其他方法可以通过ID进行删除,副作用较小:

(代码可能有误,只是为了展示想法)

Long id = whateverWayYouGetTheId();
Patient patientToBeDeleted = entityManager.getReference(Patient.class, id);
entityManager.remove(patientToBeDeleted);