当前位置: 首页 > 知识库问答 >
问题:

Hibernate继承hql类型

上官兴昌
2023-03-14

我在Hibernate中有道传承,下面是代码:

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);
  }
}

用户DAO:

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

我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。

用户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);
  }
}

客户道:

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

销售DAO:

public class SalesRepDaoImpl extends UserDaoImpl<SalesRep> implements SalesRepDao{

}

我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出java.lang.ClassCastException,它抱怨SalesRep无法转换为客户。由于我使用CusterDap来查询数据库,它使用泛型类型来确保Customer道中使用的T应该是一个客户,在这种情况下,BaseDaoImpl中的findSing()方法如何返回SalesRep的实例,我认为它应该返回null,因为没有客户拥有用户名。

共有1个答案

马阳曦
2023-03-14

首先-

“来自用户”的查询不允许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等在运行时继承泛型类型。

 类似资料:
  • 我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。

  • 我有4个实体: ,,, 和4个表: 现在我想在一个查询中选择所有有课程的用户(如果存在的话)(注意用户没有课程)这个select生成如下所示: 您可以清楚地看到,Hibernate没有与t_student_course表连接 我正在使用Hibernate 4.1 Final 问题:Hibernate支持这样的查询吗 a)如果支持,那么为什么它不为实体获取课程? b)如果不支持,我如何选择所有的用户

  • 1. 前言 本节课程和大家一起学习继承映射。通过本节课程的学习,你将了解到: 什么是继承映射; 实现继承映射的 3 种方案。 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射? 继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。 为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该

  • 类继承是一个类扩展另一个类的一种方式。 因此,我们可以在现有功能之上创建新功能。 “extends” 关键字 假设我们有 class Animal: class Animal { constructor(name) { this.speed = 0; this.name = name; } run(speed) { this.speed = speed;

  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。

  • 并尝试通过Hibernate使用策略连接实现继承,但当我使用此策略时,我收到异常: 奇怪的是,如果我选择另一个策略(单表或TABLE_PER_CLASS),错误不会出现