gpt4 book ai didi

java - Hibernate继承hql类型

转载 作者:行者123 更新时间:2023-12-01 10:01:48 24 4
gpt4 key购买 nike

我在hibernate中有dao继承,代码如下:

public class BaseDaoImpl<T> implements BaseDao<T> {
...
protected T findSingle(String hql,Object... params){
List<T> list = find(hql,params);
if(list == null || list.isEmpty()){
return null;
}
if(list.size() > 1){
logger.debug("HQL: {} does not return single element.",hql);
}
logger.info("find single: "+list.get(0));
return list.get(0);
}
}

用户道:

public interface UserDao<T extends User> extends BaseDao<T> {
...
public T getUserByUsername(String username);
}

我有一个域类用户和两个用户子类:客户和销售。我有两个用于客户和销售的 dao 类。

用户道:

public class UserDaoImpl<T extends User> extends BaseDaoImpl<T> implements UserDao<T>,BaseDao<T> {
public T getUserByUsername(String username) {
return findSingle("from User user where user.username = ?",username);
}
}

CustomerDao:

public class CustomerDaoImpl extends UserDaoImpl<Customer> implements CustomerDao {
private static Logger logger = LoggerFactory.getLogger(CustomerDaoImpl.class);
public Double getDeposit(Integer id) {
Customer customer = get(Customer.class,id);
if(customer != null){
return customer.getDeposit();
}
return 0D;
}
}

销售道:

public class SalesRepDaoImpl extends UserDaoImpl<SalesRep> implements SalesRepDao{

}

我的问题是,当我使用 customerDap 使用销售用户名(拥有用户名的用户是 SalesRep 的实例,而不是 Customer)调用方法 getUserByUsername() (继承自 BaseDaoImpl)时,它会抛出 java .lang.ClassCastException,它提示 SalesRep 无法转换为 Customer。当我使用 customerDao 查询数据库并且它使用泛型类型来确保 CustomerDao 中使用的 T 应该是 Customer 时,我认为在这种情况下 BaseDaoImpl 中的 findSingle() 方法将如何返回 SalesRep 的实例它将返回 null,因为没有客户拥有用户名。

最佳答案

首先 -> 我假设您使用 hibernate 继承策略。

查询“来自用户” hibernate 状态不允许神奇地知道您只搜索客户。您必须更改查询或整体机制。

示例解决方案

public class UserDaoImpl<T extends User> extends BaseDaoImpl<T> implements UserDao<T>,BaseDao<T> {

protected Class<T> entityClass;

public UserDaoImpl(Class<T> entityClass) {
this.entityClass = entityClass;
}
public T getUserByUsername(String username) {
return findSingle("from " + getEntityName() + " entity where entity.username = ?",username);
}

protected String getEntityName() {
return entityClass.getSimpleName();
}
}

如果UserDaoImpl不单独使用,可以使用例如TypeTools在运行时继承泛型类型。

关于java - Hibernate继承hql类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com