2014-01-05 78 views
1

我有这样一段代码:JPA BigInteger和长期问题

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Offer> query = cb.createQuery(Offer.class); 
Root<Offer> root = query.from(Offer.class); 
query = query.select(root).where(cb.equal(root.get(Offer_.companyID), company.getId())); 
return em.createQuery(query).getResultList() 

现在,这看起来不错,花花公子,但它给了我的问题。 offer.companyID和company.id都很长。

这里是什么日志显示我,Hibernate是这样做的:

Hibernate: SELECT C.id FROM company C INNER JOIN company_operators cm 
ON cm.company_id = c.id WHERE cm.operators_id = '503' 

,这是错误我得到:

12:47:00,581 ERROR [org.jboss.ejb3.invocation] (http--0.0.0.0-9080-5) JBAS014134: EJB Invocation failed on component OfferRepository for method public java.util.List org.jboss.tools.example.richfaces.data.OfferRepository.getOffersbyMemberId(java.lang.Long) throws java.lang.Exception: javax.ejb.EJBException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long 

什么能在这里是什么问题?

回答

1

嗯,我想我已经找到了答案。我已经表明上面的代码

一条线是

Company company = companyRepo.getUsersCompany(memberId); 

因此,company.getId()在我的查询,从获取的PostgreSQL公司实体。在这个过程中,它隐含地将id标识为“BigInteger”。

所以我必须做的是显式的龙,现在我的方法是这样的:

Company company = companyRepo.getUsersCompany(memberId); 
    if (company == null) return null; 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Offer> query = cb.createQuery(Offer.class); 
    Root<Offer> root = query.from(Offer.class); 
    Long companyId = company.getId(); 
    query = query.select(root).where(cb.equal(root.get(Offer_.companyID), companyId)); 
    return em.createQuery(query).getResultList(); 
0

在您的实体中,您的数字为Long。您需要将其更改为BigInteger。您的JPA正在为您返回BigInteger

改变这些东西象下面这样:

private Long id; 

private BigInteger id; 
+0

谢谢。你知道为什么JPA返回BigInteger并且可以避免它吗? – Zlatko

+0

我不知道为什么。我有一个应用程序(使用JDeveloper创建)用于使用'Long'的Weblogic,但是当我再次创建相同的应用程序时(使用另一个版本的JDeveloper),它给了我'BigInteger'。数据库是oracle。我可以怀疑这可能是JPA版本的问题。或者我们可能需要在某个地方改变配置中的某些东西!但我没有在这方面证实。 –

+0

看起来像JPA显式地将东西转换成它认为的东西。 – Zlatko

1

这取决于什么类型,你在你的实体指定和什么是在表列。 它必须相同。检查两者是否相同。

+0

他们应该是,但他们不是。在所有实体中,我使用Long作为id。 – Zlatko