第一部分
测试情况如下:
maven修改
com.alibaba
druid
1.1.10
实体类
@Table(name = "dpcenter.xeuser")
public class OUser {
private String userid;
private String username;
...
}
测试代码
public static void main(String[] args) {
OracleStyle style=new OracleStyle();
ConnectionSource cs = ConnectionSourceHelper.getSingle(druidSource());
SQLLoader loader = new ClasspathLoader("/org/beetl/sql/test");
DebugInterceptor debug = new DebugInterceptor(OracleQuickTest.class.getName());
Interceptor[] inters = new Interceptor[]{ debug};
final SQLManager sql = new SQLManager(style,loader,cs,new UnderlinedNameConversion(), inters);
OUser ou=new OUser();
ou.setUserid("hp-test");
ou.setUsername("test");
OUserDao oUserDao=sql.getMapper(OUserDao.class);
oUserDao.insert(ou);
}
public static DataSource druidSource() {
com.alibaba.druid.pool.DruidDataSource ds = new com.alibaba.druid.pool.DruidDataSource();
ds.setUrl("jdbc:oracle:thin:@192.168.1.4:1521:orcl");
ds.setUsername("dpmanage");
ds.setPassword("dpmanage");
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
return ds;
}
报错信息
Exception in thread "main" java.lang.RuntimeException: java.sql.SQLFeatureNotSupportedException
at org.beetl.sql.core.db.MetadataManager.initDefaultSchema(MetadataManager.java:278)
at org.beetl.sql.core.db.MetadataManager.(MetadataManager.java:33)
at org.beetl.sql.core.SQLManager.initMetadataManager(SQLManager.java:254)
at org.beetl.sql.core.SQLManager.(SQLManager.java:180)
at org.beetl.sql.core.SQLManager.(SQLManager.java:156)
at org.beetl.sql.core.SQLManager.(SQLManager.java:151)
at org.beetl.sql.core.SQLManager.(SQLManager.java:138)
at org.beetl.sql.test.OracleQuickTest.main(OracleQuickTest.java:23)
Caused by: java.sql.SQLFeatureNotSupportedException
at com.alibaba.druid.pool.DruidPooledConnection.getSchema(DruidPooledConnection.java:1191)
at org.beetl.sql.core.db.MetadataManager.setDefaultSchema(MetadataManager.java:293)
at org.beetl.sql.core.db.MetadataManager.initDefaultSchema(MetadataManager.java:275)
... 7 more
第二部分
修改beetlsql代码MetadataManager
private void setDefaultSchema(Connection conn) throws SQLException{
try {
this.defalutCatalog = conn.getCatalog();
}catch(Throwable e) {
// jdbc低版本不支持
e.printStackTrace();
}
try{
this.defaultSchema = conn.getSchema();
}catch(Exception e){
// jdbc低版本不支持
String dbName = sm.getDbStyle().getName();
if(dbName.equals("postgres")){
defaultSchema = "public";
}else if(dbName.equals("sqlserver")){
defaultSchema="dbo";
}else if(dbName.equals("oracle")){
defaultSchema = conn.getMetaData().getUserName();
}else{
defaultSchema = null;
}
}
}
报错会产生
Exception in thread "main" org.beetl.sql.core.BeetlSQLException: java.sql.SQLSyntaxErrorException: ORA-00928: 缺失 SELECT 关键字
at org.beetl.sql.core.SQLScript.insert(SQLScript.java:206)
at org.beetl.sql.core.SQLManager.generalInsert(SQLManager.java:1152)
at org.beetl.sql.core.SQLManager.insert(SQLManager.java:1090)
at org.beetl.sql.core.SQLManager.insert(SQLManager.java:1046)
at org.beetl.sql.core.mapper.internal.InsertAmi.call(InsertAmi.java:19)
at org.beetl.sql.core.mapper.MapperJavaProxy.invoke(MapperJavaProxy.java:155)
at org.beetl.sql.core.mapper.MapperJava8Proxy.invoke(MapperJava8Proxy.java:92)
at com.sun.proxy.$Proxy2.insert(Unknown Source)
at org.beetl.sql.test.OracleQuickTest.main(OracleQuickTest.java:29)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00928: 缺失 SELECT 关键字
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:256)
at org.beetl.sql.core.SQLScript.insert(SQLScript.java:201)
... 8 more
Disconnected from the target VM, address: '127.0.0.1:65488', transport: 'socket'
┏━━━━━ Debug [oUser._gen_insert] ━━━
┣ SQL: insert into dpcenter.XEUSER () VALUES ()
┣ 参数: []
┣ 位置: org.beetl.sql.test.OracleQuickTest.main(OracleQuickTest.java:29)
┗━━━━━ Debug [ ERROR:ORA-00928: 缺失 SELECT 关键字] ━━━
使用版本 2.10.29
总结
1 如果使用beetlsql-2.10.29+druid-1.1.10 会产生SQLFeatureNotSupportedException,原因是catch了Error没有catch Exception
2 如果修改了1中的Error为Exception可启动程序
3 oracle中使用@Table(name="{schema}.{tableName}")时会产生错误,分析原因是获取tableName时会截取"."后面的字符串作为tableName。本来想修改一下然后提交给作者,但考虑整体架构扩展性还是提交给issue吧