2016-02-10 1 views
0

Я пытаюсь удалить строку с идентификатором, который отображается в текстовом поле, и я получил ошибку: «не удалось извлечь ResultSet». Я попытался сделать это двумя способами, но никто из них не работает ... как я могу сделать это правильно?Hibernate - удалить строку на основе введенного ID ... как?

первый способ:

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; 
+0

В ваших запросах вы ссылаетесь на idpatient, а ваша @Id роль пациента - PID: поэтому в запросах вы ссылаетесь на несуществующее свойство. Другое имя PID проблемы несовместимо с поведением по умолчанию Hibernate - внутри запроса, который на самом деле чувствителен к регистру PID. (и это также может быть источником проблем) –

+0

И не забудьте очистить() ваши изменения до завершения транзакции, может быть, ваша среда не будет автоматически очищаться. –

+0

что-то не в тему: вы уверены, что хотите управлять транзакцией вручную? Обычно это не очень хорошая идея, особенно если ваше приложение становится более сложным –

ответ

0

Это

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

должно быть

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

при условии, что должна быть только одна строка, возвращаемая основана на поиска идентификатора.

Еще лучше проверить, сколько строк возвращено, может быть нулевым.

0

Первый путь должен быть

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

Второй путь должен быть:

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

Поскольку вы используете HQL и он работает как Java Objects, вы должны ссылаться на атрибут idpatient Повсеместно Объект пациента.

Надеюсь, эта информация поможет вам.

Удачи.

0

Если вы просто удаляете объект по идентификатору, я не думаю, что первый способ - это путь, когда вы произвольно выбираете объект.

Второй способ менее переносимый. Iirc, массовое удаление/обновление в HQL/JPQL доступно только в более поздней версии JPA/Hibernate, и такое массовое удаление/обновление может вызвать флеш и недействительность/обновление кеша первого уровня (не помню очень четко, если это верно для точка первого уровня кэша, хотя: P)

Есть другой способ сделать УДАЛ.по ID с меньшим количеством побочных эффектов:

(код может быть неправильным, просто для демонстрации идеи)

Long id = whateverWayYouGetTheId(); 
Patient patientToBeDeleted = entityManager.getReference(Patient.class, id); 
entityManager.remove(patientToBeDeleted); 
Смежные вопросы