SpringBoot JPA与HQL抉择使用
什么是hql:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架。 Hibernate可以自动生成SQL语句、自动执行,从而使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
什么是JPA:JPA是 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。通过添加注解可以快速完成简单点的数据库增删改查操作,JPA规范制定过程中就是借鉴了Hibernate等这些开源的持久框架JPA。
在使用jap时
①首先需要在实体类entity上添加@entity注解,在对应属性上添加@Column(name = "xx"),使实体类与sql表完成映射。 ②在dao层继承JpaRepository ,类上添加@Component注解,
方法中@Query内添加sql语句。这里只需要写查询语句即可。增加,修改,删除只需要jpa提供方法即可。 ③controller层只需要@Autowired声明引入,不仅可以使用dao内写好的方法还可以使用jpa提供的.save、.delete方法快速完成增删改查操作。但是jap有个缺陷,就是.save方法需要传入整个实体类才能完成修改,这就导致了方法异步执行的时候导致脏数据影响数据准确,这时候如果只想修改做变更的属性,需要在entity类上添加@DynamicUpdate注解。 在Nvisual的接口中简单查询修改使用jpa来说是最优解决方式,但是Nvisual的模型库每一列都有属于自己的查询筛选 这就需要SQL语句需要执行各种各样的筛选条件。很多人这时候就会问,将“AND xxx=xxx”筛选条件用#{#xx}拼接进sql里不就行了吗,这就是问题关键,jpa不支持sql拼接,用string拼接进去的字符串会被强行带上单引号’’使sql语句报错,这时候可以考虑用hql来实现复杂的“拼接”查询。
相比而言,hql在dao层写法相对复杂,使用EntityManager的.createNativeQuery(sql)使用拼接的sql查寻语句字符串完成查询,.setFirstResult(skip);.setMaxResults(take);完成分页,但.createNativeQuery(sql)麻烦点在于,查询出的结果只是一个list<>,就是说没有key只有value,需要一个个取出来set存入实体类再返回 在简单的增删改查接口下,建议使用JPA完成,复杂查询就需要用到HQL。
最后,大家可以来使用一下NVisual的模型库列表,感受一下hql与DevExtreme结合生成的强大表单
http://192.168.100.104:8080/modelLibrary/list/mainTable/1/20/1
yangfan