java - Hibernate继承hql类型

标签 java hibernate hql

我在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/

相关文章:

java - session.createQuery() 在 spring 中不返回列表

java - HQL - 选择嵌套对象

java - BIP4435聚合回复节点收到回复消息,回复消息 ID 为 :

java - 在 spring mvc hibernate 应用程序中从字符串转换为 blob 时出错

java - 错误 : java. lang.NoClassDefFoundError:antlr/RecognitionException

grails - 获取Grails的最新更新记录

java - 使用 Spring MVC 创建服务时出错

java - Java 中的非法日期字符串

java - 如何将ByteArrayRawSerializer的messageSize设置为无限制?

spring - 如何从 Spring Boot 中排除依赖项