JPA BigInteger和Long问题

时间:2014-01-05 04:14:58

标签: java hibernate jpa long-integer 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

这可能是什么问题?

3 个答案:

答案 0 :(得分:1)

好吧,我想我找到了答案。

我所展示的代码上方的一行是

Company company = companyRepo.getUsersCompany(memberId);

因此,我的查询中的company.getId()是从postgresql获取公司实体。在这个过程中,它隐含地将id转换为'BigInteger'。

所以我必须做的是显式转换为Long,现在我的方法看起来像这样:

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

答案 1 :(得分:1)

这取决于您在实体中指定的类型以及表列中的内容。 它必须是一样的。检查两者是否相同。

答案 2 :(得分:0)

在您的实体中,您有Long个数字。您需要将这些更改为BigInteger。您的JPA正在向您发送BigInteger

更改以下内容:

private Long id;

private BigInteger id;