2015-02-13 4 views
0

Я хочу написать общий метод, который ищет значение столбца и возвращает существующий объект или новый объект type T. T имеет поле данных String name с соответствующим getName().Java, Hibernate - Как создать общие методы getByColumnValue()?

это не работает для объектов, которые имеют столбец имя:

static public <T> T getByName(Class<T> type, final String name) { 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    List<T> list = session.createCriteria(type).list(); 
    session.getTransaction().commit(); 
    session.close(); 
    for (T entry : list) { 
     if (entry.getName().equals(name)) { 
      return entry; 
     } 
    } 
    return new Class<T>(name);//or return null and create object in the calling method 
} 

entry должен быть приведен к конкретному классу T, как я могу добиться этого? Есть ли лучший подход?

редактировать

Решение основано на Aaron Digulla ответ:

static public <T> T getByName(Class<T> type, final String name) { 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    Query sqlQuery = session.createQuery("from " + type.getName() + " where name = :name"); 
    sqlQuery.setParameter("name", name); 
    @SuppressWarnings("unchecked") 
    List<T> entries = sqlQuery.list(); 
    session.getTransaction().commit(); 
    session.close(); 
    if (entries.size() == 1) { 
     return entries.get(0); 
    } 
    return null; 
} 

ответ

2

Вы должны использовать HQL для этого:

Query q = s.createQuery("from " + type.getName() + " where name = :name"); 
q.setParameter("name", name); 
List<T> result = q.list(); 

Вы можете даже написать метод, который может запросить произвольные столбцы путем передачи имени столбца в метод.

+0

спасибо, но я думаю, что это должно быть 'q.setParameter (" name ", name)'. – Frank

+0

@Frank: Совершенно верно. Исправлена. –

Смежные вопросы