Java JPA大整数和长问题

Java JPA大整数和长问题,java,hibernate,jpa,long-integer,biginteger,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.ge

我有一段代码如下:

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()
    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();
这就是我得到的错误:

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

这里可能有什么问题?

在您的实体中,数字的长度是
Long
。您需要将它们更改为
biginger
。您的JPA正在返回您的
biginger

更改如下内容:

private Long id;


嗯,我想我已经找到了答案

我显示的代码上面的一行是

Company company = companyRepo.getUsersCompany(memberId);
因此,我的查询中的company.getId()正在从postgresql获取公司实体。在这个过程中,它隐式地将id转换为“biginger”

所以我要做的是显式转换为Long,现在我的方法如下所示:

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()
    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();
Company Company=companyRepo.getUsersCompany(memberId);
如果(company==null)返回null;
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(Offer.class);
Root=query.from(Offer.class);
Long companyId=company.getId();
query=query.select(root).where(cb.equal(root.get(Offer.companyID),companyID));
返回em.createQuery(query.getResultList();

这取决于您在实体和表列中指定的类型。
一定是一样的。检查两者是否相同。

谢谢。你知道为什么JPA返回BigInteger吗?它可以避免吗?我不知道为什么。我有一个Weblogic应用程序(使用JDeveloper创建),它使用的是
Long
,但当我再次创建同一个应用程序(使用另一个版本的JDeveloper)时,它给了我
biginger
。数据库是oracle。我可以怀疑这可能是JPA版本的问题。或者我们可能需要在某个地方更改某些配置!但我在这方面没有得到证实。似乎JPA不合法地将事情按照它认为的那样进行了。它们应该是,但它们不是。在所有实体中,我使用Long-as-id。