原文链接:https://www.cuba-platform.com/blog/spring-query-interfaces-in-cuba
翻译:CUBA China
CUBA-Platform 官网 : https://www.cuba-platform.com
CUBA China 官网 :
根本原因
开发人员通常不喜欢改变他们编码的习惯。当我刚才是接触 CUBA 的时候,发现不需要学很多新的东西,创建应用程序的过程也是非常顺利的。但是其中有一样是需要重新学习的,那就是如何使用数据。
在Spring框架中,有好几个库可以用来处理数据,其中最流行的一个就是 spring-data-jpa,使用这个库可以使开发人员在很多情况下避免编写SQL或者JPQL。只需要创建一个接口类,然后在接口中创建 的方法,Spring会自动帮你创建和执行查询语句。
比如,这里有一个接口,其中有个方法是数数有多少客户是同一个姓的:
可以直接将这个接口注入到service中,然后就可以在需要的地方调用这个方法了(注意,不需要写实现类)。
CUBA提供了很多开箱即用的数据操控方法,比如加载实体的部分属性以及成熟的数据安全子系统 - 可以限制数据访问权限至实体属性和表数据的行级别。并且这些所有的功能都带有API,但是跟大家都知道的Spring Data或者JPA/Hibernate的略有不同。
所以,为什么在CUBA中没有上面说的查询接口?有没有可能添加呢?
CUBA中使用数据的方式
CUBA的API中有三个主要的类用来处理数据:DataStore,EntityManager 和 DataManager。
DataStore 的抽象是提供处理持久化存储的API,比如RDBMS,文件系统或者云存储。可以通过DataStore执行基本的数据操作,但是,不推荐直接使用DataStore,除非需要开发自定义的持久化存储或者需要对底层存储进行非常特殊的访问。
EntityManager 很大程度上只是JPA EntityManager 的拷贝,但是有额外的方法用来处理 CUBA视图、软删除以及 CUBA 查询语句。作为CUBA开发人员,很少在日常工作中使用这个类,除非需要克服CUBA的安全限制。
下一个要说的,DataManager,是在CUBA中处理数据主要使用的类。此类提供了处理数据的API并且支持到属性和行级别的 CUBA安全模型 。当查询数据的时候,DataManager会隐式的修改查询语句。比如,在关系型数据库中,它会更改“select”语句,排除那些受限的属性,然后自动添加“where”语句来筛选那些当前用户不能看到的数据行。这种安全感知的行为是很有帮助的,开发人员不需要死记在查询语句中需要添加哪些关于安全方面的条件。
这里有个CUBA类交互的图,展示使用DataManager从RDBMS中获取数据的过程。
使用DataManager可以相对容易的查询实体(或者使用CUBA视图查询实体层级结构)。最简单的查询是这样:
DataManager会自己过滤掉“软删除”的记录、受限制访问的实体属性或实体,也会自己创建数据库事务。
但是如果需要执行带有复杂“where”条件的查询语句,就需要写JPQL了。
看看最开头那个例子,如果需要按姓统计客户人数,在CUBA中需要写这样的:
这里可以看到,需要将JPQL语句丢给DataManager去执行。在CUBA API里,JPQL需要用字符串来定义(目前还不支持Criteria API)。JPQL有很好的可读性,也能清晰的定义一个查询语句,但是如果出问题,可能不是很好调试。另外,JPQL字符串不像Criteria API那样能在构建编译时进行验证,或者在Spring上下文初始化的时候验证。
比较一下Spring Data JPA 的接口: