【发布时间】:2013-12-30 09:23:17
【问题描述】:
我有一个 Java Web 应用程序,它目前支持 DB2 和 Oracle 作为后端数据库。我也计划支持 MySQL,因此面临这个问题。
到目前为止,我一直在代码本身中对查询进行硬编码,并在必要时为 Oracle 和 DB2 不同的查询设置 if-else 条件。
例如。为了让前 10 名员工获得高薪,我必须像这样编写代码
String query = null;
if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("oracle"))
{
query = "select * from ( select * from emp order by sal desc ) where ROWNUM <= 5";
}
else if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("db2"))
{
query = "select * from emp order by sal desc fetch first 5 rows only";
}
如果我添加 Mysql,if-else 条件会变大并且变得混乱。
if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("oracle"))
{
query = "select * from ( select * from emp order by sal desc ) where ROWNUM <= 5";
}
else if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("db2"))
{
query = "select * from emp order by sal desc fetch first 5 rows only";
}
else if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("mysql"))
{
query = "select * from emp order by sal desc limit 0,5";
}
您认为有什么办法可以解决这个问题。 Hibernate/JPA可以解决这个问题吗?
我尝试过的事情
1) 编写了一个工厂设计模式来进行基于接口的查询选择。只需调用 Interface.getHighSalEmployees(),它就会根据加载的驱动程序返回具体类实现的查询。也就是说如果应用程序连接到Oracle,它会给我OracleConcreteClass.getHighSalEmployees()
2) 阅读有关 Hibernate/HQL 的信息 - 但无法找到任何可能的内容。
【问题讨论】: