动态组合带有连接条件的SQL查询的最佳方法是什么?我不想为网页或一组网页上的每个不同条件硬编码查询。它甚至可行吗?
我能够组装简单的查询,但是当我需要插入连接条件时,我感到难过,即如何找出连接的依赖关系等。
答案 0 :(得分:2)
构建复杂动态查询的首选方法是:
<伪码>
select_clause = 'SELECT '
from_clause = 'FROM '
where_clause = 'WHERE '
orderby_clause = 'ORDER BY '
if [query on person] then
select_clause += 'p.name, p.dob '
from_clause += 'person p '
orderby_clause += 'p.name '
if [query on address] then
select_clause += 'a.address_text '
from_clause += ', address a '
where_clause += 'p.address_id = a.id AND a.id=:p1 '
else
where_clause += 'p.id=:p1'
end if
end if
sql_stmt = select_clause + from_clause + where_clause + orderby_clause + ';'
< /伪>
因此,上面的代码可能会产生以下语句:
SELECT p.name, p.dob
FROM person p
WHERE p.id=:p1
ORDER BY p.name;
SELECT p.name, p.dob, a.address_text
FROM person p, address a
WHERE p.address_id = a.id AND a.id=:p1
ORDER BY p.name;
使用更多参数,这种方法意味着我不必处理指数增加数量的可能标准组合。
答案 1 :(得分:1)
public String AssembleSimpleSelectQuery(String TableName,Hashtable<String,String> criteria) {
Hashtable<String,String> columnlist = ReturnColumnList(TableName);
Iterator<String> iter = columnlist.keySet().iterator();
int count = 0;
query=new StringBuilder();
query.append("SELECT ");
while(iter.hasNext())
{
count++;
query.append(iter.next());
if(count < (columnlist.size()))
{
query.append(",");
}
}
query.append(" From " + TableName );
Iterator<String> crit = criteria.keySet().iterator();
if(criteria.size()>0)
{
query.append(" where ");
}
count = 0;
while(crit.hasNext())
{
count++;
String temp = crit.next();
query.append(temp + "=");
if(columnlist.get(temp).equals("String") || columnlist.get(temp).equals("Id"))
{
query.append("'" + criteria.get(temp) + "'");
}
else if(columnlist.get(temp).equals("Date"))
{
query.append("to_date('"+criteria.get(temp)+"','mm-dd-yyyy')");
}
if(count < criteria.size())
{
query.append(" and ");
}
}
return query.toString();
}
/ 这是创建简单选择查询的示例函数 --i调用returncolumnlist,它从存储表名及其列的xml文件中读取,并返回列名及其数据类型的哈希表.... - 我还没想出如何在这个代码中加入一个连接条件(可能超过1)...所以寻找想法......我不寻找代码... /
答案 2 :(得分:0)
您可以使用iBatis。它有一个名为Dynamic SQL的功能。有了这个,您可以根据几个条件在运行时创建动态查询。
答案 3 :(得分:0)
Hibernate有API来构建查询而不必连接字符串,请参见:
http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Criteria.html