Java教程

hibernate error 及 sql

本文主要是介绍hibernate error 及 sql,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.No validator could be found for constraint

No validator could be found for constraint 'org.hibernate.validator.constraints.NotBlank' validating type 'java.math.BigInteger'. Check configuration for 'id'
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.throwExceptionForNullValidator(ConstraintTree.java:229)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:310)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:244)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:116)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87)
	at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:620)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:583)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForNonDefaultGroup(ValidatorImpl.java:543)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:457)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:410)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:207)
解决办法:
@NotEmpty 用在集合类上面;不能为null,而且长度必须大于0,(" “,” ")
@NotBlank 只能作用在String上面, 不能为null,而且调用trim()后,长度必须大于0 (“test”) 即:必须有实际字符
@NotNull 用在基本类型,整型上(Integer、Long、Short…),对象也可以用这个,但是对象内部里面就不能校验了,不能为null,但可以为empty,(""," “,” ")

2.org.hibernate.exception.ConstraintViolationException: could not execute statement

解决办法:
违反约束异常,无法执行语句.
很有可能是某个字段数据库不能为null,而传过去的值为null
仔细检查约束条件

3.实体注解 No identifier specified for entity

org.hibernate.AnnotationException: No identifier specified for entity
解决办法:
没有添加加主键的注解@Id,这个是必须的。但是我的实体类中明明已经添加了@Id

4.保存 IdentifierGenerationException

org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
解决办法:
错误提示是说,id的生成错误,在保存之前,需先生成,增加注解,id生成策略,自增
@Id
@GeneratedValue(strategy = GenerationType.AUTO)

5.sql语法判断条件参数类型不一致 FreeMarker template error Can't compare values of these types.

FreeMarker template error (DEBUG mode; use RETHROW in production!):
Can't compare values of these types. Allowed comparisons are between two numbers, two strings, two dates, or two booleans.
Left hand operand is a number (wrapper: f.t.SimpleNumber).
Right hand operand is a string (wrapper: f.t.SimpleScalar).
The blamed expression:
==> status == "-1"  [in template "queryxxxCount" at line 35, column 58]
解决办法:
error:左右两边不能是不一样的类型, status是 int 值,sql模板中正确应该是status == -1

6.hibernate 遍历集合, hql语法基于freemarker的语法,扩展了include_hql 标签

<sql-query id="queryUserByids">
  <![CDATA[
      select * from user where id in
      (
        <#list ids as id>
            <#if ids?size == id_index +1>
                '${id}'
            <#else>
                '${id}',
            </#if>
        </list>
      )
  ]]>
</sql-query>

7.强制转换map错误 Caused by: java.lang.ClassCastException

Caused by: java.lang.ClassCastException: com.xxx.xxxEntity cannot be cast to java.util.Map
	at org.hibernate.property.access.internal.PropertyAccessMapImpl$SetterImpl.set(PropertyAccessMapImpl.java:102)
	at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:78)
	at org.hibernate.hql.internal.HolderInstantiator.instantiate(HolderInstantiator.java:75)
	at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:435)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429)
	at org.hibernate.loader.Loader.list(Loader.java:2424)
解决办法:
修改具体sql,检查sql的返回查询列的名字是否和定义的实体对象的属性名称是否一致
源码跟踪:从sql中获取result,然后放入list中,放入的时候需要反射list对象的属性值,tuple[i] 是具体内容值,result是对象class
         使用反射,获取对应sql 属性名称 ,通过反射设置对象属性值    
这篇关于hibernate error 及 sql的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!