2016-09-15 37 views
0

我用下面的方法獲取預定義的對象。Hibernate:如何讓預定義的對象通過參數傳遞一個字符串值

public Patient getUserNameAndPassword(String username, Session session) { 
     Patient patient=(Patient)session.get(Patient.class,username); 
     return patient;  
} 

執行此方法後,生成以下異常。

org.hibernate.TypeMismatchException: Provided id of the wrong type for class beans.Patient. Expected: class java.lang.Integer, got class java.lang.String 

PatientService.java

public class PatientService { 

    private static PatientDAOInterface patientDAOInterface; 

    public PatientService() { 
     patientDAOInterface = new PatientDAOImpl(); 
    } 

    public Session getSession() { 
     Session session = patientDAOInterface.openCurrentSession(); 
     return session; 
    } 

    public Transaction getTransaction(Session session) { 
     return patientDAOInterface.openTransaction(session); 
    } 

    public Patient getUserNameAndPassword(String username){ 
     Session session = patientDAOInterface.openCurrentSession(); 
     Transaction transaction = null; 

     Patient patient=new Patient(); 
     try{ 
      transaction = patientDAOInterface.openTransaction(session); 
      patient=patientDAOInterface.getUserNameAndPassword(username, session); 
      transaction.commit(); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
     }finally{ 
      session.close(); 
     }   
     return patient; 
    } 
} 

PatientDAOInterface的.java

public interface PatientDAOInterface 
{ 
    public Patient getUserNameAndPassword(String username,Session session); 
    public Session openCurrentSession(); 
    public Transaction openTransaction(Session session); 
} 

PatientDAOImpl.java

public class PatientDAOImpl implements PatientDAOInterface { 
    @Override 
    public Patient getUserNameAndPassword(String username, Session session) { 
     Patient patient=(Patient)session.get(Patient.class,username); 
     return patient;  
    }  

    private static final SessionFactoryBuilder sessionFactoryBuilder = SessionFactoryBuilder.getInstance(); 

    @Override 
    public Session openCurrentSession() { 

     Session currentSession = sessionFactoryBuilder.getSessionFactory().openSession(); 
    return currentSession; 
    } 

    @Override 
    public Transaction openTransaction(Session session) { 

     Transaction beginTransaction = session.beginTransaction(); 
     return beginTransaction; 
    } 

} 

我已經提到過我的作品了。

其實,我想通過參數傳遞一個字符串並獲得一個Patient對象。 我熟悉通過Integer而不是String。但我不知道這件事。

有什麼想法?

+0

看起來您已經創建了一個使用整數並傳遞字符串來獲取Patient對象的方法。請提供有關您的session.get(Patient.class,用戶名)方法如何工作的更準確信息。 –

回答

3

你想通過他的用戶名找到病人嗎?因爲你在這裏試圖通過他的ID找到他,並且你傳遞了一個表示用戶名的字符串。您應該編寫自己的查詢/標準以通過用戶名獲取Patient。事情是這樣的:

Criteria criteria = session.createCriteria(Patient.class); 
criteria.add(Restrictions.eq("username", username); 
List<Patient> patients = criteria.list(); 

或查詢版本:

String hql = "FROM Patient p WHERE p.username = "+username; 
Query query = session.createQuery(hql); 
List patients = query.list(); 
+0

好的。但是我想要一個患者對象作爲返回類型而不是患者列表。 – Barrier

+1

需要檢索列表,因爲可能會有很多患者使用相同的用戶名(至少Hibernate認爲是這樣,它沒有這方面的知識)。只要'return patients.get(0)'。 – Shadov

+1

假設該用戶名沒有重複,則可以返回patients.get(0) –

1

我找到了一個解決問題的辦法。

public Patient getUserNameAndPassword(String username, Session session) { 
     Query query=session.createQuery("from Patient where user_name= :username"); 
     query.setParameter("username", username); 
     List list = query.list(); 
     Patient patient=(Patient) list.get(0); 
     return patient; 
} 

這是爲我工作。

謝謝。

相關問題