genericdaohibernate添加除id以外的getbyfield

时间:2013-07-17 07:06:18

标签: java hibernate appfuse

我正在使用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()创建方法(但现在对我来说这不是必需的,将来也可能。)

1 个答案:

答案 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;
}