Tag: sql

如何对SQL查询进行unit testing?

我有一个类DBHandler ,它接受一个查询,通过SQL服务器运行它,检查错误并返回结果。 我怎样才能对这门课进行unit testing? 编辑 :我会尝试更精确: DBHandler负责将查询传递给服务器。 为了测试它实际上是这样,抛出正确的exception等,我想将它连接到我将填充的模拟数据库。 我的问题是 – 怎么做? 如何创建处理调用的模拟“服务器”?

当两个表具有相同的列名时,NonUniqueDiscoveredSqlAliasException

我有两个表Item和Nikasa – 其定义如下: Item { id, name, spec}和Nikasa {id, date, item_id}. 这里item_id表示Item.id 我做了一个简单的原生SQL连接,只选择Item.id和Nikasa.id : Session s = getSession(); SQLQuery sq = s.createSQLQuery(“SELECT it.id, nik.id FROM item it LEFT JOIN nikasa nik ON (it.id = nik.item_id)”); List result = sq.list(); 但我得到exceptionNonUniqueDiscoveredSqlAliasException : Encountered a duplicated sql alias [ID] during auto-discovery of a native-sql query List result=sq.list(); […]

在处理庞大的数据表时,我应该如何使用Hibernate Mapping

问题定义: 我有一个数据库表,包含大量数据(超过100,000行),表结构就像 AppID DocID DocStatus 1 100 0 1 101 1 2 200 0 2 300 1 每个applicationID可能有数千个文档,我必须获取状态为0的文档的计数和状态为1的文档的数量按applicationID分组。 当我使用hibernate映射这个对象时,由于大量的表数据,它会占用大量的堆内存。 如何使用Hibernate查询实现此目的? 或者我应该使用SQL查询或存储过程吗? 注意:我的Web应用程序在JAVA / Tapestry框架中并使用Hibernate 3.数据库是SQL Server 2012。

将行数据从SQL数据映射到Java对象

我有一个Java类,其实例字段(和匹配的setter方法)匹配SQL数据库表的列名。 我想优雅地从表中获取一行(到ResultSet中)并将其映射到该类的实例。 例如: 我有一个“学生”类,其实例字段为“FNAME”,“LNAME”,“GRADE”,并为每个实例提供适当的getter和setter方法。 我还有一个SQL表,其中包含三个同名的列。 现在我正在做这样的事情: rs = statement.executeQuery(query); Student student = new Student(); student.setFNAME(rs.getString(“FNAME”)); student.setLNAME(rs.getString(“LNAME”)); student.setGRADE(rs.getString(“GRADE”)); 必须有一个不那么冗长的方式,对吧? 当我添加列时,这可能会变得非常烦人和混乱。

SQL JPA – 多列作为主键

如果我想要一个严格的列来组成一个ID。 SQL示例: CONSTRAINT [PK_NAME] PRIMARY KEY ([Column1],[Column2],[Column3]) 我怎么能用Jpa Entity类做到这一点? 通过columndefinition? 只需将id字段设置为: value = Column1 + Column2 + Column3 // aint working.

存储过程通过Java运行速度比直接在数据库上运行慢30%

我正在使用Java 1.6,JTDS 1.2.2(也只是尝试1.2.4无效)和SQL Server 2005来创建CallableStatement来运行存储过程(没有参数)。 我看到运行相同存储过程的Java包装器比使用SQL Server Management Studio慢30%。 我运行MS SQL分析器,两个进程之间的I / O差别不大,所以我认为它与查询计划缓存无关。 存储的proc不带参数,也不返回任何数据。 它使用服务器端游标来计算填充表所需的值。 我无法看到从Java调用存储过程如何增加30%的开销,当然它只是数据库的一个管道,SQL被发送下来然后数据库执行它….数据库是否可以提供Java应用不同的查询计划? 我已发布到MSDN论坛和sourceforge JTDS论坛(主题:“在JTDS中存储过程比在DB中更直接”)我想知道是否有人有任何关于为什么会发生这种情况的建议? 提前致谢, -詹姆士 (NB不要害怕,我会在找到解决方案后整理其他论坛中的所有答案) Java代码段: sLogger.info(“Preparing call…”); stmt = mCon.prepareCall(“SP_WB200_POPULATE_TABLE_limited_rows”); sLogger.info(“Call prepared. Executing procedure…”); stmt.executeQuery(); sLogger.info(“Procedure complete.”); 我已经运行了sql profiler,并发现了以下内容: Java app:CPU:466,514阅读次数:142,478,387撰写:284,078期限:983,796 SSMS:CPU:466,973阅读次数:142,440,401写作:280,244持续时间:769,851 (两个DBCC DROPCLEANBUFFERS在分析之前运行,并且都产生正确的行数) 所以我的结论是他们都执行相同的读写操作,只是他们这样做的方式不同,你们怎么想? 事实certificate,不同客户端的查询计划明显不同(Java客户端在插入期间更新索引,而不是在更快的SQL客户端中,执行连接的方式也不同(嵌套循环Vs.收集流,嵌套循环Vs索引扫描,唉!))。 这就是为什么,我还不知道(当我到底时,我会重新发帖) 结语 我无法让它正常工作。 我尝试在Java和Mgmt studio客户端之间对连接属性( arithabort , ansi_nulls等)进行同质化。 它最终导致两个不同的客户端具有非常相似的查询/执行计划(但仍然具有不同的实际plan_ids)。 我发布了我在MSDN SQL Server论坛上发现的内容摘要,因为我发现不仅在JDBC客户端和管理工作室之间,而且在Microsoft自己的命令行客户端SQLCMD之间有不同的性能,我还检查了一些更激进的事情,如网络流量也可以将存储的proc包装在另一个存储过程中,只是为了咧嘴笑。 […]

如何直观地显示java ResultSet?

我正在寻找一种在屏幕上显示java.sql.ResultSet的方法。 最好是内置于java或swing。 如果这些都没有一个简单的方法,我会考虑spring。 怎么样?

查看Jasper报告执行的SQL

运行在报表文件(.jrxml)中嵌入SQL的Jasper报表时,是否可以看到执行的SQL? 理想情况下,我还希望看到替换每个$ P {}占位符的值。 干杯, 唐

JPA GROUP BY实体 – 这可能吗?

是否可以通过引用实体进行分组来选择JPA中的数据? 我的意思是:我有两个实体 – 保险和参考多对一车辆。 保险实体有validTill字段(当然还有车辆字段)。 我想选择车辆,这是最新的保险。 以下查询不起作用: SELECT DISTINCT v.vehicle, max(v.validTill) as lastValidTill FROM TraInsurance v GROUP BY v.vehicle ORDER BY lastValidTill 上面的查询失败并显示错误: ERROR: column “travehicle1_.id_brand” must appear in the GROUP BY clause or be used in an aggregate function 这是因为JPA将引用车辆的所有字段添加到查询而不是GROUP BY。 这是我做错了吗? 或者也许只是不可能这样做? 编辑: TraInsurance实体 @Entity @Table(name = “TRA_INSURANCES”, schema=”public”) @SequenceGenerator(name = “TRA_INSURANCES_SEQ”, sequenceName […]

JDBC时间戳和日期GMT问题

我有一个JDBC Date列,如果ai使用getDate只是在2009年10月2日获得’ date ‘部分,但是如果我使用getTimestamp我得到完整的’ date ‘ 2009年10月2日13:56:78:890 。 这是我想要的。 但是,getTimestamp返回的’date’会忽略’GMT值,假设日期; 2009年10月2日13:56:78:890 ,我最终获得2009年10月2日15:56:78:890 我的日期在数据库中保存为+ 2GMT日期,但应用程序服务器在GMT上,即落后2小时 怎么还能按照现状,2009年10月2日13:56:78:890 编辑 我在客户端获得了GMT +2上的日期+2