commit ed03d11222e0258e59ab78a466d020db5dba8492
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Sun Aug 2 17:10:46 2015 +0200

    ......

diff --git a/src/querybuilder.cpp b/src/querybuilder.cpp
index cd0a765..aaf7cbc 100644
--- a/src/querybuilder.cpp
+++ b/src/querybuilder.cpp
@@ -820,11 +820,12 @@ QString QueryBuilder::countKeyword() const {
 }
 
 QString QueryBuilder::inFunction(Query &q, QString column,
-                                 QList<QVariant> values) {
+                                 QList<QVariant> values, bool notOp) {
     QString condition = "";
     if (!values.isEmpty()) {
         bool first = true;
-        condition = this->schema->quoteColumnName(column) + " " + this->inKeyword() +
+        condition = this->schema->quoteColumnName(column) + " " + this->appendNot(
+                        notOp) + this->inKeyword() +
                     " (";
         for (int var = 0; var < values.size(); ++var) {
             if (first) {
@@ -842,12 +843,16 @@ QString QueryBuilder::inFunction(Query &q, QString column,
 }
 
 QString QueryBuilder::between(QString colName, QString valName1,
-                              QString valName2) {
+                              QString valName2, bool notOp) {
     return "(" + this->schema->quoteColumnName(colName) + " " + this->between() +
            " " + this->placeHolder(valName1) + " " + this->andKeyword() + " " +
            this->placeHolder(valName2) + ")";
 }
 
+QString QueryBuilder::appendNot(bool notOp) {
+    return (notOp ? (this->notKeyword() + " ") : "");
+}
+
 QString QueryBuilder::entityClassname() const {
     return QString("CuteEntityManager::Entity");
 }
@@ -1153,8 +1158,11 @@ void QueryBuilder::plainAnd(Query &query) {
 }
 
 
-void QueryBuilder::where(Query &query, QString, QVariant) {
-
+void QueryBuilder::where(Query &query, QString column, QVariant value) {
+    QString placeholder = column + "_where";
+    query.appendCondition(this->schema->quoteColumnName(column) + "=" +
+                          this->placeHolder(placeholder));
+    query.appendParam(placeholder, value);
 }
 
 void QueryBuilder::where(Query &query, QHash<QString, QVariant> conditions,
@@ -1171,27 +1179,53 @@ void QueryBuilder::between(Query &query, QString column, QVariant firstValue,
                            QVariant secondValue) {
     QString firstPh = column + "_bet1";
     QString secondPh = column + "_bet2";
-    query.appendParam(firstPh, firstValue);
-    query.appendParam(secondPh, secondValue);
-    query.appendCondition(this->between(column, firstPh, secondPh));
+    this->appendCondition(query, firstPh, secondPh, firstValue, secondValue,
+                          this->between(column, firstPh, secondPh));
 }
 
-void QueryBuilder::in(Query &query, QString column, QList<QVariant> values) {
-    query.appendCondition(this->inFunction(query, column, values));
+void QueryBuilder::notBetween(Query &query, QString column, QVariant firstValue,
+                              QVariant secondValue) {
+    QString firstPh = column + "_nbet1";
+    QString secondPh = column + "_nbet2";
+    this->appendCondition(query, firstPh, secondPh, firstValue, secondValue,
+                          this->between(column, firstPh, secondPh, true));
 }
 
-void QueryBuilder::notIn(Query &query, QString column, QList<QVariant> values) {
-    query.appendCondition(this->notKeyword() + " " + this->inFunction(query, column,
-                          values));
+
+void QueryBuilder::appendCondition(Query &q, QString ph1, QString ph2,
+                                   QVariant val1, QVariant val2, QString condition) {
+    q.appendParam(ph1, val1);
+    q.appendParam(ph2, val2);
+    q.appendCondition(condition);
 }
 
-void QueryBuilder::notOperator(Query &query, QString column, QVariant value) {
+void QueryBuilder::in(Query &query, QString column, QList<QVariant> values) {
+    query.appendCondition(this->inFunction(query, column, values));
+}
 
+void QueryBuilder::notIn(Query &query, QString column, QList<QVariant> values) {
+    query.appendCondition(this->inFunction(query, column,
+                                           values, true));
 }
 
 void QueryBuilder::orOperator(Query &query,
-                              QHash<QString, QVariant> conditions) {
-
+                              QHash<QString, QVariant> conditions, bool like) {
+    if (!conditions.isEmpty()) {
+        QString condition = "(";
+        bool first = true;
+        for (auto i = conditions.constBegin(); i != conditions.constEnd(); ++i) {
+            if (first) {
+                first = false;
+            } else {
+                condition += " " + this->orKeyword() + " ";
+            }
+            condition += this->schema->quoteColumnName(i.key()) + (like ? " LIKE " : "=") +
+                         this->placeHolder(i.key());
+            query.appendParam(i.key(), i.value());
+        }
+        condition += ")";
+        query.appendCondition(condition);
+    }
 }
 
 QString QueryBuilder::where(const QSharedPointer<Entity> &entity,
diff --git a/src/querybuilder.h b/src/querybuilder.h
index 42b1ce3..0758666 100644
--- a/src/querybuilder.h
+++ b/src/querybuilder.h
@@ -141,14 +141,15 @@ class QueryBuilder {
                     bool ignoreID = false, const QString &primaryKey = "id") const;
     void bindValue(const QString &key, const QVariant &value, QSqlQuery &q) const;
     virtual QString placeHolder(const QString &key) const;
-    void where(Query &query,QString, QVariant);
+    void where(Query &query, QString column, QVariant value);
     void where(Query &query,QHash<QString, QVariant> conditions, QString concat="AND");
     void where(Query &query,QHash<QString, QList<QVariant>> conditions, QString concat="AND");
     void between(Query &query,QString column, QVariant firstValue, QVariant secondValue);
+    void notBetween(Query &query,QString column, QVariant firstValue, QVariant secondValue);
     void in(Query &query,QString column, QList<QVariant> values);
     void notIn(Query &query,QString column, QList<QVariant> values);
     void notOperator(Query &query,QString column, QVariant value);
-    void orOperator(Query &query,QHash<QString, QVariant> conditions);
+    void orOperator(Query &query, QHash<QString, QVariant> conditions, bool like=false);
     void andOperator(Query &query,QHash<QString, QVariant> conditions);
     void arbitraryOperator(Query &query,QString op, QString column, QVariant value);
 
@@ -256,8 +257,10 @@ class QueryBuilder {
     virtual QString inKeyword() const;
     virtual QString whereKeyword() const;
     virtual QString countKeyword() const;
-    virtual QString inFunction(Query &q, QString column, QList<QVariant> values);
-    virtual QString between(QString colName, QString valName1, QString valName2);
+    virtual QString inFunction(Query &q, QString column, QList<QVariant> values, bool notOp=false);
+    virtual QString between(QString colName, QString valName1, QString valName2, bool notOp=false);
+    QString appendNot(bool notOp);
+    virtual void appendCondition(Query &q, QString ph1, QString ph2, QVariant val1, QVariant val2, QString condition);
     QString entityClassname() const;
 
     QSharedPointer<Schema> schema;
