使用过程的一些问题记录-持续更新
如果使用nativeQuery,则where参数只能使用诸如【?1,@Param("")等】
上面这句话不对,测试之后发现,无论是否为nativeQuery,都是可以用命名参数的,只是说如果方法有写出来的参数必须要用到,不能写了就放那不用。
WHERE ( :#{#var1.proName} IS NULL OR T.PRO_NAME LIKE %:#{#var1.proName}% )
@Query(value = "SELECT * FROM tb_entity t WHERE t.name LIKE %?1%",nativeQuery = true)
Page<Entity> queryByEntity(String name);
@Query(value = "SELECT sa FROM Salary sa WHERE sa.id = :#{#proId}")
Page<Salary> queryByProject(Long proId, Salary sa, Pageable page);
ORA-00932: inconsistent datatypes: expected NUMBER got BINARY
// 出现此错误一般是 where 条件后面的参数问题,出现于以下:
WHERE (?1 IS NULL OR ID = ?1),如果传参数 ?1 为 null 那么 OR 后面的条件应该走不过去,但是仍然报错了,说是期望是数字但是传的却是二进制的。
如果期望像 mybatis 动态查询一样,在 ?1 为空时就不把 ?1 当做查询条件,当 ?1 有值时就加入 ?1 作为查询条件。
解决办法:如果不希望 ?1 参与条件过滤则给 ?1 传入 -1 ,WHER 条件改为 WHERE (?1 = -1 OR ID = ?1) 主键值通常不会为 -1 这样不会报错。
实体类中字段的注解
// 更新者
@LastModifiedBy
// 注释掉后会报错,`Basic` attribute type should not be 'Persistent Entity',意思就是实体字段的属性不应该是另一个持久化实体类型
// @ManyToOne(fetch = FetchType.LAZY, optional = false)
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "update_by")
@JsonIgnore
private User updateBy;
一些报错
org.hibernate.QueryException: Named parameter not bound
StackOverflow上面的相关问题及解决方案
// StackOverflow
@Query("SELECT c FROM Client c WHERE c.id LIKE CONCAT(:#{#f.id}) AND LOWER(c.contract) LIKE LOWER(CONCAT('%',:#{#f.contract}, '%'))"
public abstract Page<Client> findWithFiltersPaginated(@Param("f") ClientFilter filter, Pageable pageable);
// mine
@Query(value = "SELECT pro FROM ProjectInfo pro WHERE " +
"AND (:#{#p.proPerson} IS NULL OR pro.proPerson LIKE CONCAT('%', :#{#p.proPerson}, '%')) " +
"AND (:#{#p.departmentOfIndustry} IS NULL OR pro.departmentOfIndustry = :#{#p.departmentOfIndustry}) " +
"AND (:#{#p.isApprove} IS NULL OR pro.isApprove = :#{#p.isApprove})")
Page<ProjectInfo> queryAsPageByLike(ProjectInfo p, Pageable page);
初步判断:SQL里面参数的摆放顺序需要与实体类字段的先后顺序对应。
实体:User {id; name; sex}
则条件查询的参数顺序为:where id = ? and name = ? and sex = ?,非如此不可,条件参数要么不写,要写按实体字段的顺序写。
但是测试过又发现某些特定顺序会报错,有时候又不会,草!
INSERT
目前项目中是直接使用insert(Entity e)的,而且字段都没有做非空限制,这样的结果就是e中属性有值的在表中也有值,e中属性为null的在表中也为null。
后来在其中一个表中加了字段非空约束并给了默认值,但是insert之后,如果非空字段对应的实体属性为null则会报错;这也算使用过程的一个小坑,jpa插入实体对象会将null属性作为null插入,而不是插入默认值。
所谓的默认值就是在你没有为该字段插入值的时候才会设为默认值,但是你插入 null,那么该列将不会生成默认值,但是你又限制了non-null所以insert出错。