我有一段这样的代码:
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
这可能是什么问题?
答案 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;