【问题标题】:hibernate join using an使用一个休眠连接
【发布时间】:2012-12-22 20:47:31
【问题描述】:

我正在尝试进行休眠联接-查询似乎有效,但是当我尝试从返回的对象转换为我希望它不起作用的类型时...我假设因为它也具有联接表信息..

@Entity
@Table(name = "PSNG_SMRY")
public class PSNG_SMRY implements Serializable, Comparable<PSNG_SMRY>
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment"  , strategy = "increment")
    @Printable
    public Integer SMRY_ID;
    public Integer DEV_ID;
    public Integer RPTD_TRN_ID;

        @OneToOne(mappedBy="smry", cascade=CascadeType.ALL)
        public TRN trn;

}

@Entity
@Table(name = "TRN")
public class TRN implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    public Integer TRN_ID;
        public String TRN_SCTN
        public String TRN_SYMB;

         @OneToOne
        @PrimaryKeyJoinColumn
        private PSNG_SMRY smry;
}

我在这里找到了这个一对一映射示例 - link

当我从休眠状态取回对象时,我尝试将其强制转换为 PSNG_SMRY,但它不会工作 - 我该如何做一个连接,在那里我使用连接从 TRN 表中获取 PSNG_SMRY 信息和 TRN_SYMB?

编辑:

我得到一个无效的转换异常 - [Ljava.lang.Object; cannot be cast to PSNG_SMRY

查询代码:

//code  from some function that sets up all queries
String qQuery = "FROM PSNG_SMRY P, TRN T WHERE  T.TRN_ID = P.RPTD_TRN_ID and P.FIR_AXLE_PASD_DT > sysdate - :timeLimit and P.FIR_AXLE_PASD_DT < sysdate - 1/24 ORDER BY P.FIR_AXLE_PASD_DT";

hqlParamList.add(new HQLParams("timeLimit", timeLimit)); //some list to pass to hibernate and then parameterize the queury

result = queryDatabase(qQuery, q4Query, hqlParamList);



public QueryResult queryDatabase(String qQuery, String q4Query,
        List<HQLParams> params) {
    QueryResult results = new QueryResult();

    jwdsqa = new Connection("JWDSQA");
    jwds4qa = new Connection("JWDS4QA");

    results.qa = jwdsqa.retrieve(qQuery, params);
    results.qa4 = jwds4qa.retrieve(q4Query, params);

    return results;
}

编辑: 这是连接类 - 它只是用于获取会话信息并执行所有休眠操作,例如获取数据...

public class Connection {

public static Logger logger = Logger.getLogger(Connection.class);

   Session session;
   String sessionName;

public Connection(String name){
session = HibernateUtil.getSessionFactory(name).openSession();

sessionName = name;
    if(session.isConnected()){
        //System.out.println(name + " - Connected");
    }
}

public Session getSession(){
    return session;
}

@SuppressWarnings("unchecked")
public List<Object> retrieve(String qry, List<HQLParams> paramList)
{
    Transaction transaction = null;
    List<Object> obj = null;

    try {
        transaction = session.beginTransaction();

        String queryString = qry;

        Query query = session.createQuery(queryString);

        if(paramList != null)
        {
            for(HQLParams param: paramList)
            {
                query.setParameter(param.paramName, param.params);
            }
        }


        List<Object> obj_ = query.list();
        obj = obj_;
        //session.getTransaction().commit();

    } catch (HibernateException ex) {
        ex.printStackTrace();
        logger.error(ex.getMessage() + "\n" + ex.getStackTrace());
        transaction.rollback();
    } catch (Exception ex) {
        System.err.println(ex.getMessage());
        logger.error(ex.getMessage() + "\n" + ex.getStackTrace());
    }
    finally
    {
        session.close();
        //System.out.println("Closing session " + sessionName);
    }

    return obj;
}
}

【问题讨论】:

  • it doesn't work - 你有例外吗?其他行为?哪个例外? + 显示您正在查询代码。
  • 实体 PSNG_SMRY 中没有 RPTD_TRN_ID 字段,因此很难解释应该如何编写查询。可以肯定的是,不仅您不尊重 Java 命名约定,而且所有字段都没有任何意义,这使得代码和查询非常难以理解。使用真实的话。
  • 我不熟悉 Hibernate API 中这样的Connection 对象。您使用的是直接 JDBC 吗?还是提供此 API 的除 Hibernate 之外的某个第 3 方?
  • @JBNizet 字段未使用 Java 命名约定命名的原因是因为您可以将字段命名为列的确切名称,而不是使用每个字段的注释,并且休眠将在没有使用注释......我更新了问题,因为我从代码中获取了 sn-ps,因为有很多字段......
  • @yair 我更新了问题以包含 Connection 类...不,我没有使用 JDBC - 使用休眠 4.1.2

标签: java hibernate join annotations hql


【解决方案1】:

我最终弄明白了——我收到转换错误的原因是休眠将PSNG_SMRYTRN 对象作为Object[] 返回——而不是作为一个对象。

【讨论】:

    【解决方案2】:

    如果您需要 PSNG_SMRY 实例,则不必询问 TRN 表。这是在您使用 JPA 映射时为您提供的

       FROM PSNG_SMRY P 
            WHERE P.FIR_AXLE_PASD_DT > sysdate - :timeLimit 
            and P.FIR_AXLE_PASD_DT < sysdate - 1/24 
            ORDER BY P.FIR_AXLE_PASD_DT
    

    如果您没有获得检索到的 PSNG_SMRY 对象的 TRN,则意味着存在映射错误,因为您正在告诉 Hibernate 如何在注释中检索 PSNG_SMRY 的 TRN

        @OneToOne(mappedBy="smry", cascade=CascadeType.ALL)
        public TRN trn;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 2016-08-15
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2014-10-22
      • 2019-01-15
      相关资源
      最近更新 更多