0

我正在从独立的 java 应用程序连接到 mysql db。我的应用程序使用了几个过滤器来确定将从 db.xml 中选择哪些数据。

在某些情况下,我想以某种方式构造 select 命令,即忽略其“WHERE”参数并从 db 中选择所有值。

这是我的例子:

String query = "SELECT * from messages WHERE type='" + type + "' ORDER BY id DESC";

变量类型可以包含一些与我的数据库中项目的 Varchar 匹配的特定类型。但是,用户可以将类型设置为“所有值”(或类似的,我希望这已经足够清楚了),在这种情况下,查询将从 db 中选择所有值(它将忽略 where 参数)。

我知道我可以通过在我的代码中简单地放置一些 if 语句并在每个分支中调用不同的 select 命令来做到这一点,但是如果使用了多个规范(WHERE 参数中的属性),这将非常无效。

例如:

String query = "SELECT * from messages WHERE type='" + type + "' AND time='" + time + "'  ORDER BY id DESC";

我不确定这是否可行。如果没有,对不起愚蠢的问题......提前谢谢!

4

3 回答 3

2

我认为您将不得不通过代码来完成它,而 SQL 中没有任何东西可以做您想做的事情。通常,人们使用类似 Hibernate 的 ORM 并以更安全的方式(以避免 SQL 注入)构造查询,而不是使用字符串连接。

这就是在 Hibernate 中完成的方式:http: //docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-narrowing

于 2013-04-26T10:11:41.773 回答
0

你可以创建一个 Type 类和一个 Time 类等等。这些类将包含一个调用的函数,该函数getSQL()返回类型或在所有类型“”的情况下返回。

于 2013-04-26T10:10:55.453 回答
0

WHERE子句允许您根据多个谓词过滤数据集。不指定它意味着没有过滤,因此您将添加的任何谓词的所有可能值。

如果您将WHERE子句视为谓词,并且将谓词视为谓词集或原子谓词,则可以通过遍历谓词嵌套轻松生成子句并生成所需的字符串。如果字符串返回为空,则完全省略该WHERE子句。

interface Predicate {
    public String toString();
}

// further derive this class for specific predicates
class AtomPredicate implements Predicate {
    public AtomPredicate(){}
    public toString() {}
}

 // basic predicate set 
class SetPredicate implements Predicate {
    public SetPredicate(String connector){this.connector = connector;}
    private ArrayList<Predicate> set;
    private String connector;
    public toString(){
        String res, tmp;
        int i;
        if (set.size() == 0) return "";
        while (res.size() == 0 && i < set.size()) {
            res = set[i++].toString();
        }
        for (; i < set.size(); ++i) {
            tmp = set[i].toString();
            if (tmp.size() > 0) 
                res += connector + " " + tmp; 
        }
        if (res.size() > 0) 
            return "(" + res + ")";
    }

    class WhereClause {
        public WhereClause() {}
        private Predicate predicate;
        public toString(){ 
            String res = predicate.toString();
            if (res.size() > 0) return "WHERE " + res;
            return "";
        }
    }

您可以从该基本大纲开始,并根据需要进行扩展。但是,您应该首先尝试寻找现有的解决方案,例如在另一个答案中链接的 jboss 库,以避免重新发明轮子。

于 2013-04-26T10:31:56.943 回答