`
liulanghan110
  • 浏览: 1082533 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

birt动态SQL

    博客分类:
  • JAVA
阅读更多

birt动态SQL实现有三种方式:拼接SQL、绑定变量和让应用程序拼接,birt得到返回结果集方式。

 

1.拼接SQL方式

在数据集中写SQL,如下:

 

select id ,code,name,type
from type

 

 

选中数据集,点script方式,在beforeOpen事件中写如下SQL:

 

var type = reportContext.getParameterValue("type");
var name = reportContext.getParameterValue("name");
var query = this.queryText;
if(type!=null){
	query = query + " and type = "+type;
}
if(name!=null&&name!=""){
	query = query + " and  name = '"+name+"'";
}
this.queryText = query;

 

然后就可以了,当然,也可以不写第一步,直接所有的SQL都在beforeOpen中拼接。

 

但是,拼接SQL方式不仅复杂容易错,还会导致SQL注入风险。

 

2.绑定变量方式

 在数据集的SQL中写如下SQL

 

select id ,code,name,type
from location
where (type = ? or ? is null )
and ( name = ? or ? is null )

 然后配置数据集的参数,如下图:

 



 

 

最后一项是链接报表的参数。倒数第二项是默认值,填null

 

这种方式不会有SQL注入风险。

 

要注意参数与问号个数要相同

 

当采用绑定变量时,数据集参数和报表参数关联时,可能会出现这样的异常:

org.eclipse.birt.report.data.oda.jdbc.JDBCException: Cannot set preparedStatement null value.

原因是数据集参数中不能将Intger 类型设置为null值,要解决这个问题,可以将

Intger 类型的参数全部改成DECIMAL,原因待研究。

 

另外如果想要查看执行的SQL,可以在数据集的SCRIPT的beforeOpen事件写如下脚本:

 

importPackage( Packages.java.io );   
out = new PrintWriter( new FileWriter("c:/debuginfo.txt", true ) );   
out.println("queryText:-->"+ this.queryText);   
out.close();

 第三种是在应该程序处理查询,BIRT负责取出结果集展示,采用的是BIRT+SPRING+MYBATIS。

 

当然这里MYBATIS也可以是其它框架,思路一样。

 

BirtBeanFactory.java

public class BirtBeanFactory {

    private static BeanFactory ctx;

    public synchronized static void setBeanFactory(BeanFactory beanFactory) {
        ctx = beanFactory;
    }

    public static Object getBean(String str) {
        return ctx.getBean(str);
    }

    public static <T> T getBean(Class<T> clazz) {
        return ctx.getBean(clazz);
    }
}

 GlobalInitializer.java

public class GlobalInitializer implements InitializingBean ,BeanFactoryAware{

	private BeanFactory beanFactory;

	@Override
	public void afterPropertiesSet() throws Exception {
		BirtBeanFactory.setBeanFactory(beanFactory);
	}

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		this.beanFactory = beanFactory;
	}
	
}

 

 

BirtDataFactory.java

public class BirtDataFactory {
	private TestService manager = (TestService) BirtBeanFactory.getBean(TestService.class);
	
	public List<Location> findListByDto(LocationDto dto){
		return manager.findListByDto(dto);
	}
}

 spring配置文件配置下:

<bean id="globalInitializer" class="com.test.birt.core.GlobalInitializer"/>

 这样代码层就完成了,

在birt中创建脚本数据源

创建脚本数据集,在数据集的open事件中写这样的方法:

importPackage(Packages.com.test.birt.core);
importPackage(Packages.com.test.birt.report.dto);
factory = new BirtDataFactory(); 
dto = new TestDto();
dto.setCreateTimeStart(reportContext.getParameterValue("createTimeStart"));
dto.setCreateTimeEnd(reportContext.getParameterValue("createTimeEnd"));

if(reportContext.getParameterValue("dcId")!=null){
	dto.setDcId(reportContext.getParameterValue("dcId").longValue());
}
collectList=factory.findListByDto(dto);
iterator = collectList.iterator(); 

 在fecth阶段,写这样 的代码:

if(iterator.hasNext() == false ){ 
	return false; 
} else{ 
	var collectBean = iterator.next(); 
	row["id"]=collectBean.getId(); 
	row["name"] = collectBean.getName(); 
	
	return true; 
} 

 这样就可以了。

 

要显示的字段(row["id"]等)可以在数据集中编辑,选中数据集--EDIT--OUTPUT COLUMNS---ADD 

 

 

  • 大小: 34.1 KB
  • 大小: 28.7 KB
0
0
分享到:
评论
4 楼 liulanghan110 2015-06-11  
cory213 写道
你好,最近在使用Birt报表
select id ,code,name,type 
from location 
where (type = ? or ? is null ) 
and ( name = ? or ? is null ) 
这里的?如type =?or ?is null,绑定2个参数 预览的是就需要填写2个参数 不然提示变量没有被指定。 能不能把这个做法的文件代码发给我参考一下 谢谢 32216166@qq.com


额,没有文件,你有什么问题么
3 楼 cory213 2015-06-09  
你好,最近在使用Birt报表
select id ,code,name,type 
from location 
where (type = ? or ? is null ) 
and ( name = ? or ? is null ) 
这里的?如type =?or ?is null,绑定2个参数 预览的是就需要填写2个参数 不然提示变量没有被指定。 能不能把这个做法的文件代码发给我参考一下 谢谢 32216166@qq.com
2 楼 liulanghan110 2015-02-03  
灰太狼1991 写道
你好,小弟最近在学习使用Birt报表
select id ,code,name,type 
from location 
where (type = ? or ? is null ) 
and ( name = ? or ? is null ) 
这一段sql,每一个?代表一个参数,那么type = ? or ? is null,这两个问好应该代表的同一个参数,会不会需要两个参数呢

需要两个参数
1 楼 灰太狼1991 2015-01-09  
你好,小弟最近在学习使用Birt报表
select id ,code,name,type 
from location 
where (type = ? or ? is null ) 
and ( name = ? or ? is null ) 
这一段sql,每一个?代表一个参数,那么type = ? or ? is null,这两个问好应该代表的同一个参数,会不会需要两个参数呢

相关推荐

    fire bird常用sql语句

    fire bird常用sql语句 一、分页写法小例: 二、显示表名和表结构 三、使用ISQL连接数据库 四、更新字段注释 五、显示字段注释 六、更新表注释 七、查询所有的表和视图(包括系统表和系统视图) 八、查询所有的用户表...

    Text2SQL_语义解析数据集、解决方案、paper资源整合项目_NL2SQL.zip

    在数据库领域中,将自然语言转换为SQL查询的能力是近年来人工智能研究的热点之一。Text2SQL,即自然语言到结构化查询语言(SQL)的转换,旨在通过理解自然语言描述的数据库查询请求,自动构建相应的SQL语句。这不仅...

    Alpha-SQL:使用蒙特卡洛树搜索的零样本Text-to-SQL转换

    随着大型语言模型(LLMs)的发展,诸如CHASE-SQL (Pourreza等,2024) 和XiYan-SQL (高云等,2024) 等方法在BIRD基准测试中取得了新的最先进成果 (李金阳等,2023) 。使用LLMs进行Text-to-SQL可以分为训练方法和零...

    OpenSearch-SQL:通过动态少样本和一致性对齐增强Text-to-SQL

    同时,我们开发了一种自学习形式的Query-CoT-SQL动态少样本策略。这些方法显著提高了LLMs在Text-to-SQL任务中的性能。 在模型选择方面,我们直接应用了基础LLMs,而未进行任何微调,从而简化了任务链并增强了框架的...

    SQL-o1:一种用于Text-to-SQL的自奖励启发式动态搜索方法

    广泛的实验表明,SQL-o1在复杂的Bird数据集上的执行准确率比最新的基线方法提高了10.8%,甚至超过了基于GPT-4的方法。此外,SQL-o1在少量样本学习场景中表现出色,并且具有强大的跨模型迁移能力。

    BASE-SQL:一种强大的开源Text-to-SQL基准方法

    实验结果显示,BASE-SQL使用开源模型Qwen2.5-Coder-32B-Instruct,在BIRD开发集上达到了67.47%的准确率,在Spider测试集上达到了88.9%的准确率,显著优于其他使用开源模型的方法,甚至超过了使用GPT-4o闭源模型的几...

    V-SQL:一种基于视图的两阶段Text-to-SQL框架

    Text-to-SQL任务旨在无偏地将自然语言转换为结构化查询语言(SQL)。...在权威数据集Bird上的结果表明,V-SQL与现有的最先进的方法相比具有竞争力。 关键词:大语言模型,Text-to-SQL,情境学习,数据库,NLP。

    Feather-SQL:一种针对小型语言模型的双模型协作轻量级NL2SQL框架

    自然语言到SQL(NL2SQL)任务在大型语言...实验结果表明,Feather-SQL在BIRD数据集上提高了SLMs的NL2SQL性能,对于未微调的模型,性能提升了约10%。所提出的范式将SLMs的准确率上限提高到了54.76%,证明了其有效性。

    java实现Flappy bird

    开发者需要了解如何使用Java的JDBC(Java Database Connectivity)接口连接到数据库,执行SQL查询和操作数据。 6. **Excel处理**:项目中提到了使用第三方库处理Excel表格。Java有许多库,如Apache POI,可以读写...

    flybird-windows-arm64.exe window平台arm64架构免费数据库MySQL管理软件

    FlyBird Database Manager 是一款MySQL管理工具。 推荐度5颗星,非常值的尝试的MySQL管理软件。 优点有: 免安装, 基于浏览器,支持导出Excel, CSV, SQL多种格式数据。 相比navicat dbeaver , workbench 更加轻量化...

    自然语言到SQL的曙光:我们准备好了吗?

    将用户的自然语言问题转换为SQL查询(即nl2sql)显著降低了访问关系数据库的门槛。大型语言模型的出现引入了nl2sql任务的... 值得注意的是, SuperSQL 在Spider和BIRD测试集上的执行准确率分别达到了 87% 和 62.66% 。

    NL2SQL-BUGs:用于检测NL2SQL翻译中语义错误的基准

    自然语言到SQL(即 NL2SQL)翻译...尽管如此,这些模型成功检测到了广泛使用的 NL2SQL 数据集 BIRD 中的 106 个错误(占 6.91% ),这些错误之前是基准中的标注错误。这突显了语义错误检测在 NL2SQL 系统中的重要性。

    MCS-SQL:利用多提示和多选题选择进行文本到SQL生成

    近年来,大型语言模型(LLMs)的进步使得基于上下文学习(ICL)的方法在文本到SQL任务中显著优于微调方法。然而,它们在包含复杂模式和查询的基准测试中的表现仍然远低于人类专家的表现,例如BIRD基准测试。本研究...

    大型语言模型能否作为数据库接口? 一个用于大规模数据库支持的Text-to-SQL基准测试

    为了缓解这一差距,我们提出了 BIRD , 一个针对大规模数据库支持的文本到SQL任务的大规模基准测试,包含 12,751 个文本到SQL对和 95 个数据库,总大小为 33.4 GB , 涵盖 37 个专业领域。我们强调数据库值的重要性,...

    蛋蛋助手v1.50+DOscan+Bird

    《全面解析:蛋蛋助手v1.50与DOscan及Bird工具的综合应用》 在信息技术领域,软件工具的高效使用是提升工作效率的关键。本文将深入探讨“蛋蛋助手v1.50”、“DOscan”以及“Bird”这三款工具的功能特性及其在实际...

    Text-to-SQL的理性化模型

    接着,通过迭代、动态的少样本知识蒸馏过程,大型语言模型得到提示,从而学习如何生成CoT注释。在验证的分解查询上训练理性化模型后,研究人员可以为T2S数据集生成大量合成的CoT注释。 为了验证这一方法的有效性,...

    模式链接的终结?在语言模型时代下的文本到SQL转换

    模式链接是文本到SQL管道中的关键步骤。其目标是在用户查询时检索目标数据库中相关的表和列,而忽略不相关的部分。然而,不完善的模式链接常常会排除生成准确...我们的方法在BIRD基准上排名第一,准确率达到71.83%。

    CODES :构建开源文本到SQL语言模型

    我们在多个数据集上进行了全面评估,包括广泛使用的Spider基准测试、新发布的BIRD基准测试,以及诸如Spider-DK、Spider-Syn、Spider-Realistic和Dr.Spider等鲁棒性诊断基准测试,还包括为金融和学术应用创建的两个...

    SQLCritic:通过子句级批评纠正Text-to-SQL生成

    近年来,Text-to-SQL(Text-to-SQL)系统的进步显著提高了将自然语言查询转换为SQL的能力,但在确保准确性和...实验结果表明,在两个主要的Text-to-SQL基准测试Spider和BIRD上取得了显著改进,证明了该方法的有效性。

    ExCoT:通过执行反馈优化Text-to-SQL的推理

    Text-to-SQL任务需要精确的推理能力,将自然语言问题转换为结构化查询。尽管大型语言模型(LLMs)在许多推理任务中表现出色,但它们在Text-to-SQL任务中利用链式思维(CoT)推理的能力仍需进一步探索。我们发现了几...

Global site tag (gtag.js) - Google Analytics