欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FreyjaJdbcTemplate特性一:HQL

程序员文章站 2022-03-07 15:20:03
...

freyja2大特点:hql+cache

 

freyja可以无缝替换掉hibernate,才怪。

 

freyja主要功能是为了实现对jdbc操作的封装而不是替换hibernate,但是为了替换掉项目中的hibernate,freyja实现了简单的hql语法(而且也实现不了复杂的)

举个例子来看下freyja大概支持哪些hql/sql语法(理论上支持全sql映射)

 

 

select x.n,x.id,x.name,devscore,u.uid,cityId from User u left join ( select * from ( select i.userId as n,i.id,h.cityId from UserInfo i left join Hero h  on h.userId = i.userId ) a) x on x.n = u.uid

这里面有User UserInfo Hero 3个对象
  
select army.name,number from ArmyProduce  where army.name = 'h' and number = 1

select * from ArmyProduce a where a.army.name = 'h' and number = 1
这里面有ArmyProduce 和Army 2个对象

ArmyProduce 和Army 是一对多关系

 @Entity

 

@Table(name = "t_army_produce")
public class ArmyProduce {
	@Id
	@GeneratedValue
	@Column(name = "Id", unique = true, nullable = false)
	private Long id;

	@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
	@JoinColumn(name = "ARMY_ID")
	private Army army;

	@Column(name = "NUMBER")
	private Integer number;

	@Column(name = "userId")
	private Long userId;

}

 可以看出和hibernate一样支持jpa规范的annotation注解没有什么区别。

但是只目前只支持ManyToOne注解,而且没有延迟加载。(其他的注解如ManyToMany不会去支持。)主键也只支持自动增长,当然其他的一些主键如uuid应该会加进来。

 

Freyja的做法是使用jsqlparser这个工具把hql结构化,然后根据annotation转化为sql。freyja支持/不支持部分写法取决于2点:

 

1、jsqlparser能否识别该写法。2、能否转化为sql。

 

理论上1通过那么2也会通过。这个也是我正在努力的一个方面。

jsqlparser的作者估计把太多脑细胞放在select语法上面了。update和delete的语法只支持非常简单的部分:

 

update table set xx='1',oo='2' where xx='3'
delete from table where xx='3'

 

 大概就这种形式。

freyja改造加上hql语法支持之后变成了:

 

update ArmyProduce set number = 1 where army.name = 'h' and number = 2
delete from ArmyProduce where army.name = 'h' and number = 1

 

 情况还是不宜乐观。

 

 

FreyjaJdbcTemplate特性一:HQL 

 

FreyjaJdbcTemplate特性二:cache

 

FreyjaJdbcTemplate特性三:JdbcTemplate