2013-07-17 1 views
0

Я использую пакет org.appfuse.dao.hibernate, и я использовал весь метод в классе GenericDaoHibernate<T,PK>.genericdaohibernate add getbyfield, отличное от id

Я нашел эти методы

public List<T> getAll(); 
public List<T> getAllDistinct(); 
public List<T> search(String searchTerm); 
public T get(PK id); 
public boolean exists(PK id); 
public T save(T object); 
public void remove(T object); 
public void remove(PK id); 
public List<T> findByNamedQuery(String queryName, Map<String, Object> queryParams); 
public void reindex(); 
public void reindexAll(boolean async); 

У меня есть несколько классов модели, услуги и методы.

Теперь я хочу получить список объектов, используя некоторые другие, заданные в классе модели, отличные от id (у меня есть некоторые общие поля во многих классах моделей). Мне нужно написать похожие методы во всех сервисах и даос. Поэтому я думал, что можно создать общий метод в общем dao.

Следующее, что я пробовал, но это не сработало.

public T getbyClientKey(Long clientkey) { 
     Session sess = getSession(); 
     IdentifierLoadAccess byId = sess.byId(persistentClass); 
     List<T> entity = (List<T>) byId.load(clientkey); 

     if (entity == null) { 
      log.warn("Uh oh, '" + this.persistentClass + "' object with client '" + clientkey + "' not found..."); 
      throw new ObjectRetrievalFailureException(this.persistentClass, clientkey); 
     } 

     return entity; 
    } 

Я знал, что это будет ошибка. и он показал TypeCastingException, потому что тип возврата byId.load(id) is объект только, а не Список.

Итак, как я могу создать такой метод? Если так, я думаю, что могу создать метод для remove() также (но это не нужно для меня сейчас, возможно, в будущем).

ответ

1

Javadoc for IdentifierLoadAccess довольно ясно, как метод load должен вести себя:

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

Это означает, что он должен вернуть только один объект, а не объект List. Попробуйте использовать его вместо T.

Если вы хотите запросить свою сущность (то есть извлекать элементы любым другим способом, кроме первичного ключа), скорее всего, вы захотите реализовать метод search(String).

Если вы хотите запросить свою сущность (то есть извлекать элементы любым другим способом, кроме первичного ключа), взгляните на UserDaoHibernate, который поставляется с AppFuse. Он содержит метод loadUserByUsername(), который реализуется так:

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    List users = getSession().createCriteria(User.class).add(Restrictions.eq("username", username)).list(); 
    if (users == null || users.isEmpty()) { 
     throw new UsernameNotFoundException("user '" + username + "' not found..."); 
    } else { 
     return (UserDetails) users.get(0); 
    } 
} 

Очевидно, что если вы хотите, чтобы вернуть все предметы, он должен быть изменен немного (это один состоит):

public List<UserDetails> loadLockedUsers() { 
    List<UserDetails> users = (List<UserDetails>) getSession().createCriteria(User.class).add(Restrictions.eq("account_locked", true)).list(); 
    return users; 
} 
+0

Что я знаю. Я хочу получить как «Список ', который тоже без id. Я имею в виду, что значение 'clientkey', которое я передаю, не является идентификатором объекта. В любом случае, для этого? –

+0

Можете ли вы показать мне пример того, как использовать этот метод поиска? , потому что сначала я попробовал этот метод поиска. вместо запроса я передал значение clientkey как String ('mymanagaerclass.search (Long.toString (clientKey), mymanagagerclass.class)') –