0

我正在使用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)仅为对象,而不是List

那么我怎样才能创建这样的方法呢?如果是这样,我想我也可以为remove()创建方法(但这对我来说现在不是必需的,可能在将来)。

4

1 回答 1

1

Javadoc forIdentifierLoadAccess非常清楚该方法的load行为方式:

返回具有给定标识符的持久实例,如果没有这样的持久实例,则返回 null。

这意味着它应该只返回一个对象,而不是一个List对象。尝试将其转换为T

如果您想查询您的实体(即通过主键以外的任何其他方式检索项目),您很可能希望实现该search(String)方法。

如果您想查询您的实体(即通过主键以外的任何其他方式检索项目),请查看UserDaoHibernateAppFuse 附带的。它包含一个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;
}
于 2013-07-17T07:15:48.867 回答