我正在使用org.appfuse.dao.hibernate
包,我使用了GenericDaoHibernate<T,PK>
类中的所有方法。
我找到了这些方法
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之外的模型类中的其他一些来获取对象列表(我在许多模型类中有一些常见字段)。 我需要在所有服务和daos中编写类似的方法。所以我在想是否有可能在通用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)
的返回类型仅为对象,而不是列表。
那么如何创建这样的方法呢? 如果是这样,我想我也可以为 remove()创建方法(但现在对我来说这不是必需的,将来也可能。)
答案 0 :(得分:1)
Javadoc for IdentifierLoadAccess
非常清楚load
方法的行为方式:
返回具有给定标识符的持久化实例,如果没有这样的持久化实例则返回null。
这意味着它应该只返回一个对象,而不是List
个对象。请尝试将其转换为T
。
如果要查询实体(即通过除主键之外的任何其他方式检索项目),您很可能希望实现 search(String)
方法。
如果要查询实体(即通过除主键之外的任何其他方式检索项目),请查看AppFuse附带的UserDaoHibernate
。它包含一个方法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;
}