2013-01-08 40 views
0

我想做一个hibernate连接 - 查询似乎工作,但是当我尝试从对象返回到类型我想要它是无效的工作...即时假设,因为它有连接表信息太..休眠加入使用

@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; 
} 
} 
+0

'它不工作' - 你会得到一个异常吗?其他行为?哪个例外? +显示你正在查询代码。 – yair

+0

编辑了问题 – JonH

+0

实体PSNG_SMRY中没有RPTD_TRN_ID字段,因此很难解释应该如何写入查询。可以肯定的是,不仅你不尊重Java命名约定,而且没有任何字段意味着什么,这使得代码和查询非常难以理解。用真实的话。 –

回答

0

我最终搞清楚了这一点 - 为什么我正在铸造错误的原因是休眠返航两个PSNG_SMRYTRN对象重新作为Object[] - 而不是作为一个对象。

0

如果你想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的如何检索TRN了PSNG_SMRY

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