hibernate 主键是String类型利用createQuery查询全表内容出错。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate 主键是String类型利用createQuery查询全表内容出错。相关的知识,希望对你有一定的参考价值。

Session session=null;
Transaction tx=null;
try
session = HibernateUtil.getCurrentSession();
tx=session.beginTransaction();
Query query=session.createQuery("from Plane ");
List<Plane> list=query.list();
for(Plane p:list)
System.out.println(p.getPlaneName());

tx.commit();

catch(Exception e)
e.printStackTrace();
if(tx!=null)tx.rollback();
finally
if(session != null && session.isOpen())session.close();


配置文件如下:
<class name="Plane" table="p_plane">
<id name="PlaneName" column="p_name" type="java.lang.String">
<generator class="assigned"></generator>
</id>
出现以下错误:
org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class java.lang.Integer, got class java.lang.String

怎么解决? 求大神。
实际上我想问的是,当主键是String类型时,Hibernate怎么查询得到list对象(全表查询)。

参考技术A 主键的assigned生成方式由程序自动生成表的主键,即在你的测试程序中要调用setId()方法,且必 须在调用save()前调用(或者说在调用save()前必须指定id,其实就是说,主键值不能为空!)。看你程序显示的异常是类型不匹配,java.lang.Integer, got class java.lang.String
,是否程序的其他的地方该输入integer的输成了string。
参考技术B 如果是全表查询的话,
String hql = "from " + entityClass.getName() ;//entityClass.getName()实体类名字
return getSession().createQuery(hql).list();
希望能帮到你。如果不是要查这个可以消息我本回答被提问者和网友采纳
参考技术C <generator class="assigned"></generator>去了

hibernate主键生成

一、主键 主键是关系数据库中的一个基本概念,它用来保证记录的唯一性主键都是没有业务含义的,所以开发 者不会、也不需要,显示地设置实体对象的主键值。但是对于数据库来说,主键是必须的 Hibernate内置了两类策略: 一类是JPA标准的主键生成策略,一类是Hibernate框架特有的主键生成策略。 JPA标准策略有4种:

1.auto策略(JPA默认的策略)如: public class Teacher {   private int id;   private String title;

  @Id   @GeneratedValue(strategy = GenerationType.AUTO)   public int getId()   {     return id;   } } 我使用的 2.table策略(保存插入记录的时,需要的主键值)如: public class Teacher {   private int id;   private String title;

  @Id   @GeneratedValue(strategy = GenerationType.TABLE,generator="myTableGenerator")   @TableGenerator(name = "myTableGenerator", table = "hibernateNeedTable",           pkColumnName = "pk_key", valueColumnName = "pk_value", pkColumnValue =  "teacherId",           initialValue = 100, allocationSize = 1000)   public int getId()   {     return id;   } } 3.sequence策略(为了使用序列)如: public class Teacher {   private int id;   private String title;

  @Id   @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="mySeqGenerator")   @SequenceGenerator(name = "mySeqGenerator", sequenceName = "t_teacher_sequence",  initialValue = 1000, allocationSize = 50)   public int getId()   {     return id;   } } 这里需要配合使用@SequenceGenerator,用来指定序列的相关信息。 name:序列生成器的名称,会在@GeneratedValue中进行引用

sequenceName:oracle数据库中的序列生成器名称

initialValue:主键的初始值

allocationSize:主键每次增长值的大小 注意:如果底层数据库不执行序列,会报错:

org.hibernate.MappingException: org.hibernate.dialect.MySQLDialect does not support sequences

4.identity策略(提供了对自增主键的支持)如: public class Teacher {   private int id;   private String title;

  @Id   @GeneratedValue(strategy = GenerationType.IDENTITY)   public int getId()   {     return id;   } }

二、总结

hibernate中一个数据模型的主键常用有三种形式:uuid、native、assigned,分别是通用唯一标识、自 增、自定义。 1、uuid是系统产生的,insert数据库时相比native要快很多,但是uuid是一长串无序字符串,理论上讲 查找起来会慢一点,但是不太会影响开发的。uuid即通用唯一标识,在不知道怎么定义主键时,它是不二的选择; 1.1、生成简单,java中已经有现成的东西,引入java.util.UUID, 1.2、通用唯一,其实可以加上全球,uuid的生成原理: 当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID, 则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没 有网卡以其他方式获得); 1.3、在任何时候两个相同数据表的数据放在一起不会出现主键冲突,这在实际开发中会带来很大的好处。 2、而native是数据库生成,在insert时会先计算所以会比uuid慢一点,但是在查找和删除数据时,会比较方便。 3、uuid和assigned的生成是在程序中完成的,一个是自动,一个是手动。所以在进行session.save() 时,不会产生sql语句,数据库中也不会有数据。而native需要读取数据库数据才能完成自动递增,所以 在执行session.save()时,就会产生相应的sql语句,数据库中就会有数据。

以上是关于hibernate 主键是String类型利用createQuery查询全表内容出错。的主要内容,如果未能解决你的问题,请参考以下文章

hibernate主键生成

hibernate+oracle+主键varchar2类型,增加序列策略注解失败

hibernate 对象主键为string

Hibernate unsaved-value 属性

Hibernate第一章知识点的总结

hibernate主键生成策略