【问题标题】:Criteria: ClassCastException Integer to Long条件:ClassCastException Integer to Long
【发布时间】:2023-04-07 07:26:01
【问题描述】:

我使用的是 Hibernate 4.2 和 PostgreSQL。

我在 postgres 中有这张表:

  id bigserial NOT NULL (chave primária)
  name text

而我的实体是:

@Entity @Table(name="customer") 公共类 Customer { @ID @GeneratedValue() @Column(name="id") 私有长id;

@Column(name="name")
private String name;

    //getters and setters }

在我的班级 (CustomerDAO) 中,我有一个按条件进行搜索的方法。

public List<Customer> getByName(String name){
        Session session = HibernateUtil.getSessionFactory().openSession();
        Criteria selection = selection.createCriteria(Customer.class);

        selection.add(Restrictions.eq("name", name));

        return selection.list(); //error here!
}

我在写实体的时候,把id设置为Integer,但是,我从int改成了Long,开始出现这个错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:36)
    at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:57)
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:93)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
    at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1969)
    at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1940)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1875)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816)
    at org.hibernate.loader.Loader.doQuery(Loader.java:900)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
    at org.hibernate.loader.Loader.doList(Loader.java:2526)
    at org.hibernate.loader.Loader.doList(Loader.java:2512)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
    at org.hibernate.loader.Loader.list(Loader.java:2337)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1662)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374)
    at com.teste.hibernate.dao.CustomerDAO.getByName(CustomerDAO.java:77)
    at Teste.main(Teste.java:44)

谢谢:)

【问题讨论】:

  • 自从您将 ID 值从 Integer 更改为 Long 后,您的表是否已重新创建?
  • 不,在我的表中 id 是 BigSerial。

标签: java hibernate postgresql


【解决方案1】:

Postgres 通常与 Serial (Integer) 或 BigSerial(Long) 一起使用,并且还会自动生成序列

试试这些方法:

  1. 将您的 @GeneratedValue 更改为 @GeneratedValue(strategy=GenerationType.IDENTITY) 并查看 如果有效。
  2. 像这样创建一个 SequenceGenerator

第二个选项

序列生成器

@SequenceGenerator(name = "tbl_costumer_id_gen", sequenceName = "tbl_costumer_id_gen",allocationSize=1) 
@Id 
@GeneratedValue(GenerationType.SEQUENCE, generator="tbl_costumer_id_gen") 
@Column(name="id") 
private Long id;

【讨论】:

  • @GeneratedValue(strategy=GenerationType.IDENTITY) 不起作用:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
相关资源
最近更新 更多