【问题标题】:Retrieving all rows of a table without HQL?检索没有 HQL 的表的所有行?
【发布时间】:2012-02-23 10:38:57
【问题描述】:

我正在使用 Hibernate 4,并且想简单地列出表的所有行。我发现的所有解决方案都建议使用“from tablename”之类的东西,但我想避免在字符串中硬编码表名。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    你可以使用

    session.createCriteria(MyEntity.class).list();
    

    例如。

    【讨论】:

    • 我该如何排序?
    • session.createCriteria(MyEntity.class).addOrder(Order.asc("age")).list();
    • 有什么方法可以保证这种类型的安全吗?
    • SharedSessionContract 类型的方法 createCriteria(Class) 已弃用。
    • @Maske 你现在知道用什么了吗?
    【解决方案2】:

    HQL 不使用表名。它使用实体名称。实体名称是(默认情况下)类名称。所以你可以使用

    String hql = "select a from " + TheEntity.class.getSimpleName() + " a";
    

    但我更喜欢可读性而不是类型安全,并使用

    String hql = "select a from TheEntity a";
    

    无论如何,您都应该对您的查询进行自动化测试。

    【讨论】:

    • 是的,查询已经过测试,但您的第二个解决方案仍然意味着重构不会考虑查询。
    • 是的,但它会被失败的测试捕获。
    • 我同意最终获得正确结果很重要,但由于该项目目前处于早期阶段,每周都会发生某种重构。因此,目前适当地支持这一点非常重要。
    • 然后使用我的第一种技术,或者使用标准。
    【解决方案3】:

    //休眠类

    public class CommonDAO<T> {
    
     Session session = null;
     Transaction transaction = null;
     private Class<T> clazz;
    
     public CommonDAO(){ //constructor
        session = HibernateUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType) {
          ParameterizedType pt = (ParameterizedType) genericSuperclass;
          Type type = pt.getActualTypeArguments()[0];
          clazz = (Class<T>) type;
        }
     }
    
     public T listById(Object id) {
      T object = null;
      try {
       object = (T) session.get(clazz, (Serializable) id);
      } catch (Exception e) {
       e.printStackTrace();
      }
      return object;
     }
    }
    

    //用户类

    public class UserDAO extends CommonDAO<UserMaster> { // Here UserMaster is pojo
    
     public UserDAO() {
      super();
     }
    
     public static void main(String ar[]) {
      UserMaster user = new UserDAO().listById(1); // 1 is id
      System.out.println(user.getUserName());
     }
    }
    

    【讨论】:

    • 不要在构造函数中对 session 做任何此类事情
    • @dikkini 为什么会这样?你能给我解释一下吗?
    • 之所以如此,是因为您的会话保持打开状态。你要做的是openqueryclose,否则你会遇到规模问题。
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2023-03-29
    • 1970-01-01
    • 2015-01-19
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多