QxSqlQuery.h 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. /****************************************************************************
  2. **
  3. ** https://www.qxorm.com/
  4. ** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
  5. **
  6. ** This file is part of the QxOrm library
  7. **
  8. ** This software is provided 'as-is', without any express or implied
  9. ** warranty. In no event will the authors be held liable for any
  10. ** damages arising from the use of this software
  11. **
  12. ** Commercial Usage
  13. ** Licensees holding valid commercial QxOrm licenses may use this file in
  14. ** accordance with the commercial license agreement provided with the
  15. ** Software or, alternatively, in accordance with the terms contained in
  16. ** a written agreement between you and Lionel Marty
  17. **
  18. ** GNU General Public License Usage
  19. ** Alternatively, this file may be used under the terms of the GNU
  20. ** General Public License version 3.0 as published by the Free Software
  21. ** Foundation and appearing in the file 'license.gpl3.txt' included in the
  22. ** packaging of this file. Please review the following information to
  23. ** ensure the GNU General Public License version 3.0 requirements will be
  24. ** met : http://www.gnu.org/copyleft/gpl.html
  25. **
  26. ** If you are unsure which license is appropriate for your use, or
  27. ** if you have questions regarding the use of this file, please contact :
  28. ** contact@qxorm.com
  29. **
  30. ****************************************************************************/
  31. #ifndef _QX_SQL_QUERY_H_
  32. #define _QX_SQL_QUERY_H_
  33. #ifdef _MSC_VER
  34. #pragma once
  35. #endif
  36. /*!
  37. * \file QxSqlQuery.h
  38. * \author Lionel Marty
  39. * \ingroup QxDao
  40. * \brief Define a user SQL query added to default SQL query builded by QxOrm library, and used by qx::dao::xxx functions to filter elements fetched from database
  41. */
  42. #ifdef Q_COMPILER_INITIALIZER_LISTS
  43. #include <initializer_list>
  44. #endif // Q_COMPILER_INITIALIZER_LISTS
  45. #ifdef _QX_ENABLE_BOOST_SERIALIZATION
  46. #include <boost/serialization/serialization.hpp>
  47. #include <boost/serialization/split_free.hpp>
  48. #include <boost/serialization/nvp.hpp>
  49. #endif // _QX_ENABLE_BOOST_SERIALIZATION
  50. #include <QtCore/qdatastream.h>
  51. #ifndef _QX_NO_JSON
  52. #include <QtCore/qjsonvalue.h>
  53. #include <QtCore/qjsonobject.h>
  54. #include <QtCore/qjsonarray.h>
  55. #include <QtCore/qjsondocument.h>
  56. #endif // _QX_NO_JSON
  57. #include <QtSql/qsqlquery.h>
  58. #include <QxCollection/QxCollection.h>
  59. #include <QxDao/QxSqlElement/QxSqlElement.h>
  60. #include <QxSerialize/QxSerializeFastCompil.h>
  61. #include <QxTraits/get_class_name.h>
  62. #include <QxRegister/QxVersion.h>
  63. #include <QxConvert/QxConvert.h>
  64. namespace qx {
  65. class QxSqlQuery;
  66. } // namespace qx
  67. #ifdef _QX_ENABLE_BOOST_SERIALIZATION
  68. namespace boost {
  69. namespace serialization {
  70. template <class Archive> inline void qx_save(Archive & ar, const qx::QxSqlQuery & t, const unsigned int file_version);
  71. template <class Archive> inline void qx_load(Archive & ar, qx::QxSqlQuery & t, const unsigned int file_version);
  72. } // namespace serialization
  73. } // namespace boost
  74. #endif // _QX_ENABLE_BOOST_SERIALIZATION
  75. QX_DLL_EXPORT QDataStream & operator<< (QDataStream & stream, const qx::QxSqlQuery & t) QX_USED;
  76. QX_DLL_EXPORT QDataStream & operator>> (QDataStream & stream, qx::QxSqlQuery & t) QX_USED;
  77. #ifndef _QX_NO_JSON
  78. namespace qx {
  79. namespace cvt {
  80. namespace detail {
  81. template <> struct QxConvert_ToJson< qx::QxSqlQuery >;
  82. template <> struct QxConvert_FromJson< qx::QxSqlQuery >;
  83. QX_DLL_EXPORT QJsonValue QxConvert_ToJson_Helper(const qx::QxSqlQuery & t, const QString & format) QX_USED;
  84. QX_DLL_EXPORT qx_bool QxConvert_FromJson_Helper(const QJsonValue & j, qx::QxSqlQuery & t, const QString & format) QX_USED;
  85. } // namespace detail
  86. } // namespace cvt
  87. } // namespace qx
  88. #endif // _QX_NO_JSON
  89. namespace qx {
  90. /*!
  91. * \ingroup QxDao
  92. * \brief qx::QxSqlQuery : define a user SQL query added to default SQL query builded by QxOrm library, and used by qx::dao::xxx functions to filter elements fetched from database
  93. *
  94. * The class <i>qx::QxSqlQuery</i> (or its typedef <i>qx_query</i>) is used to communicate with database (to filter, to sort, etc.) in two different ways :
  95. * - writing manually SQL query ;
  96. * - using C++ methods with a syntax similar to SQL (same concept than the great library <i>SubSonic</i> for .Net).
  97. *
  98. * With the first method (writing manually SQL query), you can use some optimizations specific for each database.
  99. * The second method (using C++ code to build SQL query) binds automatically SQL parameters without using <i>qx::QxSqlQuery::bind()</i> function.
  100. *
  101. * Here is an example with <i>qx::QxSqlQuery</i> class writing manually a SQL query :
  102. * \code
  103. // Build a SQL query to fetch only 'author' of type 'female'
  104. qx::QxSqlQuery query("WHERE author.sex = :sex");
  105. query.bind(":sex", author::female);
  106. QList<author> list_of_female;
  107. QSqlError daoError = qx::dao::fetch_by_query(query, list_of_female);
  108. // Here we can work with the collection provided by database
  109. for (long l = 0; l < list_of_female.count(); l++) { ; }
  110. * \endcode
  111. *
  112. * QxOrm library provides 3 styles to write SQL parameters.
  113. * This style can be modified for a project using the following method <i>qx::QxSqlDatabase::getSingleton()->setSqlPlaceHolderStyle()</i> :
  114. * - <i>ph_style_2_point_name</i> : "WHERE author.sex = :sex" (default style) ;
  115. * - <i>ph_style_at_name</i> : "WHERE author.sex = @sex" ;
  116. * - <i>ph_style_question_mark</i> : "WHERE author.sex = ?".
  117. *
  118. * Here is the same example using C++ code of the class <i>qx::QxSqlQuery</i> (or its typedef <i>qx_query</i>) to build query automatically :
  119. * \code
  120. // Build a SQL query to fetch only 'author' of type 'female'
  121. qx_query query;
  122. query.where("author.sex").isEqualTo(author::female);
  123. QList<author> list_of_female;
  124. QSqlError daoError = qx::dao::fetch_by_query(query, list_of_female);
  125. // Here we can work with the collection provided by database
  126. for (long l = 0; l < list_of_female.count(); l++) { ; }
  127. * \endcode
  128. *
  129. * With C++ methods of <i>qx::QxSqlQuery</i> class, you don't have to bind any SQL parameter, and the syntax is similar to real SQL.
  130. * All SQL parameters will be provided to database automatically with the following style : <i>qx::QxSqlDatabase::getSingleton()->getSqlPlaceHolderStyle()</i>.
  131. *
  132. * Here is an example with many methods of <i>qx::QxSqlQuery</i> class (or its typedef <i>qx_query</i>) :
  133. * \code
  134. qx_query query;
  135. query.where("sex").isEqualTo(author::female)
  136. .and_("age").isGreaterThan(38)
  137. .or_("last_name").isNotEqualTo("Dupont")
  138. .or_("first_name").like("Alfred")
  139. .and_OpenParenthesis("id").isLessThanOrEqualTo(999)
  140. .and_("birth_date").isBetween(date1, date2)
  141. .closeParenthesis()
  142. .or_("id").in(50, 999, 11, 23, 78945)
  143. .and_("is_deleted").isNotNull()
  144. .orderAsc("last_name", "first_name", "sex")
  145. .limit(50, 150);
  146. * \endcode
  147. *
  148. * This code will produce following SQL for <i>MySQL</i>, <i>PostgreSQL</i> and <i>SQLite</i> databases (for <i>Oracle</i> and <i>SQLServer</i>, there is a specific process for <i>limit()</i> method) :
  149. * \code
  150. WHERE sex = :sex_1_0
  151. AND age > :age_3_0
  152. OR last_name <> :last_name_5_0
  153. OR first_name LIKE :first_name_7_0
  154. AND ( id <= :id_10_0 AND birth_date BETWEEN :birth_date_12_0_1 AND :birth_date_12_0_2 )
  155. OR id IN (:id_15_0_0, :id_15_0_1, :id_15_0_2, :id_15_0_3, :id_15_0_4)
  156. AND is_deleted IS NOT NULL
  157. ORDER BY last_name ASC, first_name ASC, sex ASC
  158. LIMIT :limit_rows_count_19_0 OFFSET :offset_start_row_19_0
  159. * \endcode
  160. *
  161. * Here is the list of all functions available to use <i>qx::QxSqlQuery</i> class (or its typedef <i>qx_query</i>) :
  162. * \code
  163. // with functions into namespace qx::dao
  164. qx::dao::count<T>()
  165. qx::dao::fetch_by_query<T>()
  166. qx::dao::update_by_query<T>()
  167. qx::dao::delete_by_query<T>()
  168. qx::dao::destroy_by_query<T>()
  169. qx::dao::fetch_by_query_with_relation<T>()
  170. qx::dao::fetch_by_query_with_all_relation<T>()
  171. qx::dao::update_by_query_with_relation<T>()
  172. qx::dao::update_by_query_with_all_relation<T>()
  173. qx::dao::update_optimized_by_query<T>()
  174. // with qx::QxSession class
  175. qx::QxSession::count<T>()
  176. qx::QxSession::fetchByQuery<T>()
  177. qx::QxSession::update<T>()
  178. qx::QxSession::deleteByQuery<T>()
  179. qx::QxSession::destroyByQuery<T>()
  180. // with qx::QxRepository<T> class
  181. qx::QxRepository<T>::count()
  182. qx::QxRepository<T>::fetchByQuery()
  183. qx::QxRepository<T>::update()
  184. qx::QxRepository<T>::deleteByQuery()
  185. qx::QxRepository<T>::destroyByQuery()
  186. * \endcode
  187. *
  188. * <i>Note :</i> those functions have 2 other optionals parameters :
  189. * - <i>const QStringList & columns</i> : to indicate columns to fetch (by default, all columns are fetched) ;
  190. * - <i>const QStringList & relation</i> : to indicate relations to fetch (<i>one-to-one</i>, <i>one-to-many</i>, <i>many-to-one</i> and <i>many-to-many</i> defined into <i>void qx::register_class<T>()</i> mapping function by class), by default there is no relation fetched.
  191. *
  192. * <i>Other note :</i> it's possible to call a stored procedure using <i>qx::QxSqlQuery</i> class, for example :
  193. * \code
  194. qx_query query("CALL MyStoredProc(:param1, :param2)");
  195. query.bind(":param1", "myValue1");
  196. query.bind(":param2", 5024, QSql::InOut);
  197. QSqlError daoError = qx::dao::call_query(query);
  198. QVariant vNewValue = query.boundValue(":param2");
  199. query.dumpSqlResult();
  200. * \endcode
  201. *
  202. * If the stored procedure returns a resultset, you can iterate over each rows and fields using the following methods (after calling <i>qx::dao::call_query()</i> function) :
  203. * - <i>long qx::QxSqlQuery::getSqlResultRowCount() const;</i>
  204. * - <i>long qx::QxSqlQuery::getSqlResultColumnCount() const;</i>
  205. * - <i>QVariant qx::QxSqlQuery::getSqlResultAt(long row, long column) const;</i>
  206. * - <i>QVariant qx::QxSqlQuery::getSqlResultAt(long row, const QString & column) const;</i>
  207. * - <i>QVector qx::QxSqlQuery::getSqlResultAllColumns() const;</i>
  208. * - <i>void qx::QxSqlQuery::dumpSqlResult();</i>
  209. *
  210. * <i>Other note :</i> to add your own SQL query methods (for example, some databases provide non-standard specifics SQL functions) :
  211. * - create a derived class based on <i>qx::QxSqlQuery</i> class ;
  212. * - if your C++ compiler supports covariant return type, add the macro <i>QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_HPP(myClass)</i> in the definition of your class (<i>myClass.h</i>) ;
  213. * - if your C++ compiler supports covariant return type, add the macro <i>QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_CPP(myClass)</i> in the implementation of your class (<i>myClass.cpp</i>) ;
  214. * - add all SQL specifics functions in your derived class.
  215. */
  216. class QX_DLL_EXPORT QxSqlQuery
  217. {
  218. #ifdef _QX_ENABLE_BOOST_SERIALIZATION
  219. template <class Archive> friend inline void boost::serialization::qx_save(Archive & ar, const qx::QxSqlQuery & t, const unsigned int file_version);
  220. template <class Archive> friend inline void boost::serialization::qx_load(Archive & ar, qx::QxSqlQuery & t, const unsigned int file_version);
  221. #endif // _QX_ENABLE_BOOST_SERIALIZATION
  222. friend QX_DLL_EXPORT QDataStream & ::operator<< (QDataStream & stream, const qx::QxSqlQuery & t);
  223. friend QX_DLL_EXPORT QDataStream & ::operator>> (QDataStream & stream, qx::QxSqlQuery & t);
  224. #ifndef _QX_NO_JSON
  225. friend struct qx::cvt::detail::QxConvert_ToJson< qx::QxSqlQuery >;
  226. friend struct qx::cvt::detail::QxConvert_FromJson< qx::QxSqlQuery >;
  227. friend QX_DLL_EXPORT QJsonValue qx::cvt::detail::QxConvert_ToJson_Helper(const qx::QxSqlQuery & t, const QString & format);
  228. friend QX_DLL_EXPORT qx_bool qx::cvt::detail::QxConvert_FromJson_Helper(const QJsonValue & j, qx::QxSqlQuery & t, const QString & format);
  229. #endif // _QX_NO_JSON
  230. protected:
  231. struct QxSqlResult
  232. { QHash<QString, int> positionByKey; QVector< QVector<QVariant> > values; };
  233. typedef std::tuple<QVariant, QSql::ParamType> type_bind_value;
  234. QStringList m_sQuery; //!< Query SQL with place-holder
  235. QxCollection<QString, type_bind_value> m_lstValue; //!< Bind value in this array
  236. qx::dao::detail::IxSqlElement_ptr m_pSqlElementTemp; //!< Temporary SQL element
  237. QList<qx::dao::detail::IxSqlElement_ptr> m_lstSqlElement; //!< List of all SQL elements to build SQL query
  238. int m_iSqlElementIndex; //!< Current index of SQL element
  239. int m_iParenthesisCount; //!< Current parenthesis count
  240. bool m_bDistinct; //!< Replace SELECT by SELECT DISTINCT in SQL query
  241. std::shared_ptr<QxSqlResult> m_pSqlResult; //!< All results returning by SQL query or stored procedure (after calling qx::dao::call_query function)
  242. QVariant m_vResponse; //!< Can be used to store some responses (from MongoDB database for example in JSON format)
  243. QString m_sType; //!< Query type (for example : 'aggregate' or 'cursor' for MongoDB database)
  244. QHash<QString, QxSqlQuery> m_lstJoinQueryUser; //!< List of SQL queries defined by user to add inside relationships joins (LEFT OUTER JOIN, INNER JOIN), for example : INNER JOIN my_table2 m2 ON (m1.id = m2.parent_id AND (XXX))
  245. QList<QxSqlQuery> m_lstJoinQueryToResolve; //!< List of SQL queries to resolve (in the right order) to add inside relationships joins (LEFT OUTER JOIN, INNER JOIN), for example : INNER JOIN my_table2 m2 ON (m1.id = m2.parent_id AND (XXX))
  246. public:
  247. QxSqlQuery();
  248. QxSqlQuery(const char * query, const QVariantList & values = QVariantList());
  249. QxSqlQuery(const QString & query, const QVariantList & values = QVariantList());
  250. QxSqlQuery(const QStringList & query);
  251. QxSqlQuery(const QString & type, const QString & query);
  252. QxSqlQuery(const QString & type, const QStringList & query);
  253. virtual ~QxSqlQuery();
  254. #ifndef _QX_NO_JSON
  255. #ifdef Q_COMPILER_INITIALIZER_LISTS
  256. QxSqlQuery(std::initializer_list<QPair<QString, QJsonValue> > json);
  257. QxSqlQuery(std::initializer_list<QPair<QString, QJsonValue> > json, std::initializer_list<QPair<QString, QJsonValue> > opts);
  258. QxSqlQuery(const QString & type, std::initializer_list<QPair<QString, QJsonValue> > json);
  259. QxSqlQuery(const QString & type, std::initializer_list<QPair<QString, QJsonValue> > json, std::initializer_list<QPair<QString, QJsonValue> > opts);
  260. #endif // Q_COMPILER_INITIALIZER_LISTS
  261. #endif // _QX_NO_JSON
  262. QString query();
  263. QString queryAt(int idx) const;
  264. void queryAt(int idx, const QString & query);
  265. QVariant response() const;
  266. QString type() const;
  267. bool isEmpty() const;
  268. bool isDistinct() const;
  269. void clear();
  270. void resolve(QSqlQuery & query) const;
  271. void resolveOutput(QSqlQuery & query, bool bFetchSqlResult);
  272. void postProcess(QString & sql) const;
  273. void setResponse(const QVariant & v);
  274. void setType(const QString & s);
  275. QString getJoinQuery(const QString & relationKey, const QString & relationAlias);
  276. QString getJoinQueryHash();
  277. QxSqlQuery & query(const QString & sQuery);
  278. QxSqlQuery & bind(const QVariant & vValue, QSql::ParamType paramType = QSql::In);
  279. QxSqlQuery & bind(const QString & sKey, const QVariant & vValue, QSql::ParamType paramType = QSql::In);
  280. QVariant boundValue(const QString & sKey) const;
  281. QVariant boundValue(int iPosition) const;
  282. long getSqlResultRowCount() const;
  283. long getSqlResultColumnCount() const;
  284. QVariant getSqlResultAt(long row, long column) const;
  285. QVariant getSqlResultAt(long row, const QString & column) const;
  286. QVector<QVariant> getSqlResultAt(long row) const;
  287. QVector<QString> getSqlResultAllColumns() const;
  288. void dumpSqlResult();
  289. static void dumpBoundValues(const QSqlQuery & query);
  290. private:
  291. void verifyQuery() const QX_USED;
  292. void fetchSqlResult(QSqlQuery & query);
  293. public:
  294. /* -- All methods to build SQL query using C++ syntax -- */
  295. virtual QxSqlQuery & distinct();
  296. virtual QxSqlQuery & where(const QString & column);
  297. virtual QxSqlQuery & where_OpenParenthesis(const QString & column);
  298. virtual QxSqlQuery & and_(const QString & column);
  299. virtual QxSqlQuery & and_OpenParenthesis(const QString & column);
  300. virtual QxSqlQuery & or_(const QString & column);
  301. virtual QxSqlQuery & or_OpenParenthesis(const QString & column);
  302. virtual QxSqlQuery & openParenthesis();
  303. virtual QxSqlQuery & closeParenthesis();
  304. virtual QxSqlQuery & orderAsc(const QStringList & columns);
  305. virtual QxSqlQuery & orderAsc(const QString & col1);
  306. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2);
  307. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3);
  308. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4);
  309. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5);
  310. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6);
  311. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7);
  312. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8);
  313. virtual QxSqlQuery & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9);
  314. virtual QxSqlQuery & orderDesc(const QStringList & columns);
  315. virtual QxSqlQuery & orderDesc(const QString & col1);
  316. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2);
  317. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3);
  318. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4);
  319. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5);
  320. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6);
  321. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7);
  322. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8);
  323. virtual QxSqlQuery & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9);
  324. virtual QxSqlQuery & groupBy(const QStringList & columns);
  325. virtual QxSqlQuery & groupBy(const QString & col1);
  326. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2);
  327. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3);
  328. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4);
  329. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5);
  330. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6);
  331. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7);
  332. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8);
  333. virtual QxSqlQuery & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9);
  334. virtual QxSqlQuery & limit(int rowsCount, int startRow = 0, bool withTies = false);
  335. virtual QxSqlQuery & like(const QString & val);
  336. virtual QxSqlQuery & notLike(const QString & val);
  337. virtual QxSqlQuery & startsWith(const QString & val);
  338. virtual QxSqlQuery & endsWith(const QString & val);
  339. virtual QxSqlQuery & containsString(const QString & val);
  340. virtual QxSqlQuery & isEqualTo(const QVariant & val);
  341. virtual QxSqlQuery & isNotEqualTo(const QVariant & val);
  342. virtual QxSqlQuery & isGreaterThan(const QVariant & val);
  343. virtual QxSqlQuery & isGreaterThanOrEqualTo(const QVariant & val);
  344. virtual QxSqlQuery & isLessThan(const QVariant & val);
  345. virtual QxSqlQuery & isLessThanOrEqualTo(const QVariant & val);
  346. virtual QxSqlQuery & customOperator(const QString & sCustomOperator, const QVariant & val);
  347. virtual QxSqlQuery & in(const QVariantList & values);
  348. virtual QxSqlQuery & in(const QVariant & val1);
  349. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2);
  350. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3);
  351. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4);
  352. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5);
  353. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6);
  354. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7);
  355. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8);
  356. virtual QxSqlQuery & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9);
  357. virtual QxSqlQuery & notIn(const QVariantList & values);
  358. virtual QxSqlQuery & notIn(const QVariant & val1);
  359. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2);
  360. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3);
  361. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4);
  362. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5);
  363. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6);
  364. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7);
  365. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8);
  366. virtual QxSqlQuery & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9);
  367. virtual QxSqlQuery & in_Select(const QxSqlQuery & query);
  368. virtual QxSqlQuery & notIn_Select(const QxSqlQuery & query);
  369. virtual QxSqlQuery & isEqualTo_Select(const QxSqlQuery & query);
  370. virtual QxSqlQuery & isNotEqualTo_Select(const QxSqlQuery & query);
  371. virtual QxSqlQuery & isNull();
  372. virtual QxSqlQuery & isNotNull();
  373. virtual QxSqlQuery & isBetween(const QVariant & val1, const QVariant & val2);
  374. virtual QxSqlQuery & isNotBetween(const QVariant & val1, const QVariant & val2);
  375. virtual QxSqlQuery & freeText(const QString & text, const QVariantList & values = QVariantList());
  376. virtual QxSqlQuery & addJoinQuery(const QString & relationKeyOrAlias, const QxSqlQuery & joinQuery);
  377. private:
  378. QxSqlQuery & addSqlExpression(const QString & column, qx::dao::detail::QxSqlExpression::type type);
  379. QxSqlQuery & addSqlCompare(const QVariant & val, qx::dao::detail::QxSqlCompare::type type, const QString & sCustomOperator = QString());
  380. QxSqlQuery & addSqlSort(const QStringList & columns, qx::dao::detail::QxSqlSort::type type);
  381. QxSqlQuery & addSqlIn(const QVariantList & values, qx::dao::detail::QxSqlIn::type type);
  382. QxSqlQuery & addSqlIsNull(qx::dao::detail::QxSqlIsNull::type type);
  383. QxSqlQuery & addSqlIsBetween(const QVariant & val1, const QVariant & val2, qx::dao::detail::QxSqlIsBetween::type type);
  384. QxSqlQuery & addFreeText(const QString & text, const QVariantList & values);
  385. QxSqlQuery & addEmbedQuery(const QxSqlQuery & query, qx::dao::detail::QxSqlEmbedQuery::type type, bool requirePreviousElement);
  386. };
  387. } // namespace qx
  388. typedef qx::QxSqlQuery qx_query;
  389. namespace qx {
  390. namespace dao {
  391. /*!
  392. * \ingroup QxDao
  393. * \brief qx::dao::call_query function can be used to call a custom SQL query or a stored procedure
  394. *
  395. * To get an output value parameter (must be pass as <i>QSql::Out</i> or <i>QSql::InOut</i>) returned by a stored procedure, just call the following method : <i>QVariant qx::QxSqlQuery::boundValue(const QString & sKey) const;</i>.<br/>
  396. * To iterate over all resultset, just use the following methods :
  397. * - <i>long qx::QxSqlQuery::getSqlResultRowCount() const;</i>
  398. * - <i>long qx::QxSqlQuery::getSqlResultColumnCount() const;</i>
  399. * - <i>QVariant qx::QxSqlQuery::getSqlResultAt(long row, long column) const;</i>
  400. * - <i>QVariant qx::QxSqlQuery::getSqlResultAt(long row, const QString & column) const;</i>
  401. * - <i>QVector qx::QxSqlQuery::getSqlResultAllColumns() const;</i>
  402. * - <i>void qx::QxSqlQuery::dumpSqlResult();</i>
  403. *
  404. * Here is an example of code using <i>qx::dao::call_query</i> function :
  405. * \code
  406. qx_query query("CALL MyStoredProc(:param1, :param2)");
  407. query.bind(":param1", "myValue1");
  408. query.bind(":param2", 5024, QSql::InOut);
  409. QSqlError daoError = qx::dao::call_query(query);
  410. QVariant vNewValue = query.boundValue(":param2");
  411. query.dumpSqlResult();
  412. * \endcode
  413. */
  414. QX_DLL_EXPORT QSqlError call_query(qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL);
  415. /*!
  416. * \ingroup QxDao
  417. * \brief qx::dao::call_query_without_prepare function can be used to call a custom SQL query or a stored procedure : same as qx::dao::call_query() function without calling prepare() QSqlQuery class method (can be useful to execute some specific SQL queries)
  418. */
  419. QX_DLL_EXPORT QSqlError call_query_without_prepare(qx::QxSqlQuery & query, QSqlDatabase * pDatabase = NULL);
  420. namespace helper {
  421. QX_DLL_EXPORT QSqlError call_query_helper(qx::QxSqlQuery & query, QSqlDatabase * pDatabase, bool bPrepare);
  422. } // namespace helper
  423. } // namespace dao
  424. } // namespace qx
  425. QX_REGISTER_CLASS_NAME(qx_query)
  426. QX_CLASS_VERSION(qx::QxSqlQuery, 0)
  427. #ifdef _QX_ENABLE_BOOST_SERIALIZATION
  428. QX_SERIALIZE_FAST_COMPIL_SAVE_LOAD_HPP(QX_DLL_EXPORT, qx::QxSqlQuery)
  429. #endif // _QX_ENABLE_BOOST_SERIALIZATION
  430. #define QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_HPP(className) \
  431. public: \
  432. \
  433. virtual className & distinct(); \
  434. \
  435. virtual className & where(const QString & column); \
  436. virtual className & where_OpenParenthesis(const QString & column); \
  437. virtual className & and_(const QString & column); \
  438. virtual className & and_OpenParenthesis(const QString & column); \
  439. virtual className & or_(const QString & column); \
  440. virtual className & or_OpenParenthesis(const QString & column); \
  441. \
  442. virtual className & openParenthesis(); \
  443. virtual className & closeParenthesis(); \
  444. \
  445. virtual className & orderAsc(const QStringList & columns); \
  446. virtual className & orderAsc(const QString & col1); \
  447. virtual className & orderAsc(const QString & col1, const QString & col2); \
  448. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3); \
  449. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4); \
  450. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5); \
  451. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6); \
  452. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7); \
  453. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8); \
  454. virtual className & orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9); \
  455. \
  456. virtual className & orderDesc(const QStringList & columns); \
  457. virtual className & orderDesc(const QString & col1); \
  458. virtual className & orderDesc(const QString & col1, const QString & col2); \
  459. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3); \
  460. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4); \
  461. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5); \
  462. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6); \
  463. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7); \
  464. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8); \
  465. virtual className & orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9); \
  466. \
  467. virtual className & groupBy(const QStringList & columns); \
  468. virtual className & groupBy(const QString & col1); \
  469. virtual className & groupBy(const QString & col1, const QString & col2); \
  470. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3); \
  471. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4); \
  472. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5); \
  473. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6); \
  474. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7); \
  475. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8); \
  476. virtual className & groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9); \
  477. \
  478. virtual className & limit(int rowsCount, int startRow = 0, bool withTies = false); \
  479. \
  480. virtual className & like(const QString & val); \
  481. virtual className & notLike(const QString & val); \
  482. virtual className & startsWith(const QString & val); \
  483. virtual className & endsWith(const QString & val); \
  484. virtual className & containsString(const QString & val); \
  485. \
  486. virtual className & isEqualTo(const QVariant & val); \
  487. virtual className & isNotEqualTo(const QVariant & val); \
  488. virtual className & isGreaterThan(const QVariant & val); \
  489. virtual className & isGreaterThanOrEqualTo(const QVariant & val); \
  490. virtual className & isLessThan(const QVariant & val); \
  491. virtual className & isLessThanOrEqualTo(const QVariant & val); \
  492. virtual className & customOperator(const QString & sCustomOperator, const QVariant & val); \
  493. \
  494. virtual className & in(const QVariantList & values); \
  495. virtual className & in(const QVariant & val1); \
  496. virtual className & in(const QVariant & val1, const QVariant & val2); \
  497. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3); \
  498. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4); \
  499. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5); \
  500. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6); \
  501. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7); \
  502. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8); \
  503. virtual className & in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9); \
  504. \
  505. virtual className & notIn(const QVariantList & values); \
  506. virtual className & notIn(const QVariant & val1); \
  507. virtual className & notIn(const QVariant & val1, const QVariant & val2); \
  508. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3); \
  509. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4); \
  510. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5); \
  511. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6); \
  512. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7); \
  513. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8); \
  514. virtual className & notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9); \
  515. \
  516. virtual className & in_Select(const QxSqlQuery & query); \
  517. virtual className & notIn_Select(const QxSqlQuery & query); \
  518. virtual className & isEqualTo_Select(const QxSqlQuery & query); \
  519. virtual className & isNotEqualTo_Select(const QxSqlQuery & query); \
  520. \
  521. virtual className & isNull(); \
  522. virtual className & isNotNull(); \
  523. \
  524. virtual className & isBetween(const QVariant & val1, const QVariant & val2); \
  525. virtual className & isNotBetween(const QVariant & val1, const QVariant & val2); \
  526. \
  527. virtual className & freeText(const QString & text, const QVariantList & values = QVariantList()); \
  528. \
  529. virtual className & addJoinQuery(const QString & relationKeyOrAlias, const QxSqlQuery & joinQuery);
  530. #define QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_CPP(className) \
  531. \
  532. className & className::distinct() { return static_cast<className &>(qx::QxSqlQuery::distinct()); } \
  533. \
  534. className & className::where(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::where(column)); } \
  535. className & className::where_OpenParenthesis(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::where_OpenParenthesis(column)); } \
  536. className & className::and_(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::and_(column)); } \
  537. className & className::and_OpenParenthesis(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::and_OpenParenthesis(column)); } \
  538. className & className::or_(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::or_(column)); } \
  539. className & className::or_OpenParenthesis(const QString & column) { return static_cast<className &>(qx::QxSqlQuery::or_OpenParenthesis(column)); } \
  540. \
  541. className & className::openParenthesis() { return static_cast<className &>(qx::QxSqlQuery::openParenthesis()); } \
  542. className & className::closeParenthesis() { return static_cast<className &>(qx::QxSqlQuery::closeParenthesis()); } \
  543. \
  544. className & className::orderAsc(const QStringList & columns) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(columns)); } \
  545. className & className::orderAsc(const QString & col1) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1)); } \
  546. className & className::orderAsc(const QString & col1, const QString & col2) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2)); } \
  547. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3)); } \
  548. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4)); } \
  549. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5)); } \
  550. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6)); } \
  551. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6, col7)); } \
  552. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6, col7, col8)); } \
  553. className & className::orderAsc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9) { return static_cast<className &>(qx::QxSqlQuery::orderAsc(col1, col2, col3, col4, col5, col6, col7, col8, col9)); } \
  554. \
  555. className & className::orderDesc(const QStringList & columns) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(columns)); } \
  556. className & className::orderDesc(const QString & col1) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1)); } \
  557. className & className::orderDesc(const QString & col1, const QString & col2) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2)); } \
  558. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3)); } \
  559. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4)); } \
  560. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5)); } \
  561. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6)); } \
  562. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6, col7)); } \
  563. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6, col7, col8)); } \
  564. className & className::orderDesc(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9) { return static_cast<className &>(qx::QxSqlQuery::orderDesc(col1, col2, col3, col4, col5, col6, col7, col8, col9)); } \
  565. \
  566. className & className::groupBy(const QStringList & columns) { return static_cast<className &>(qx::QxSqlQuery::groupBy(columns)); } \
  567. className & className::groupBy(const QString & col1) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1)); } \
  568. className & className::groupBy(const QString & col1, const QString & col2) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2)); } \
  569. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3)); } \
  570. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4)); } \
  571. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5)); } \
  572. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6)); } \
  573. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6, col7)); } \
  574. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6, col7, col8)); } \
  575. className & className::groupBy(const QString & col1, const QString & col2, const QString & col3, const QString & col4, const QString & col5, const QString & col6, const QString & col7, const QString & col8, const QString & col9) { return static_cast<className &>(qx::QxSqlQuery::groupBy(col1, col2, col3, col4, col5, col6, col7, col8, col9)); } \
  576. \
  577. className & className::limit(int rowsCount, int startRow, bool withTies) { return static_cast<className &>(qx::QxSqlQuery::limit(rowsCount, startRow, withTies)); } \
  578. \
  579. className & className::like(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::like(val)); } \
  580. className & className::notLike(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::notLike(val)); } \
  581. className & className::startsWith(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::startsWith(val)); } \
  582. className & className::endsWith(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::endsWith(val)); } \
  583. className & className::containsString(const QString & val) { return static_cast<className &>(qx::QxSqlQuery::containsString(val)); } \
  584. \
  585. className & className::isEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isEqualTo(val)); } \
  586. className & className::isNotEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isNotEqualTo(val)); } \
  587. className & className::isGreaterThan(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isGreaterThan(val)); } \
  588. className & className::isGreaterThanOrEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isGreaterThanOrEqualTo(val)); } \
  589. className & className::isLessThan(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isLessThan(val)); } \
  590. className & className::isLessThanOrEqualTo(const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::isLessThanOrEqualTo(val)); } \
  591. className & className::customOperator(const QString & sCustomOperator, const QVariant & val) { return static_cast<className &>(qx::QxSqlQuery::customOperator(sCustomOperator, val)); } \
  592. \
  593. className & className::in(const QVariantList & values) { return static_cast<className &>(qx::QxSqlQuery::in(values)); } \
  594. className & className::in(const QVariant & val1) { return static_cast<className &>(qx::QxSqlQuery::in(val1)); } \
  595. className & className::in(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2)); } \
  596. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3)); } \
  597. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4)); } \
  598. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5)); } \
  599. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6)); } \
  600. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6, val7)); } \
  601. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6, val7, val8)); } \
  602. className & className::in(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9) { return static_cast<className &>(qx::QxSqlQuery::in(val1, val2, val3, val4, val5, val6, val7, val8, val9)); } \
  603. \
  604. className & className::notIn(const QVariantList & values) { return static_cast<className &>(qx::QxSqlQuery::notIn(values)); } \
  605. className & className::notIn(const QVariant & val1) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1)); } \
  606. className & className::notIn(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2)); } \
  607. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3)); } \
  608. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4)); } \
  609. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5)); } \
  610. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6)); } \
  611. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6, val7)); } \
  612. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6, val7, val8)); } \
  613. className & className::notIn(const QVariant & val1, const QVariant & val2, const QVariant & val3, const QVariant & val4, const QVariant & val5, const QVariant & val6, const QVariant & val7, const QVariant & val8, const QVariant & val9) { return static_cast<className &>(qx::QxSqlQuery::notIn(val1, val2, val3, val4, val5, val6, val7, val8, val9)); } \
  614. \
  615. className & className::in_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::in_Select(query)); } \
  616. className & className::notIn_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::notIn_Select(query)); } \
  617. className & className::isEqualTo_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::isEqualTo_Select(query)); } \
  618. className & className::isNotEqualTo_Select(const QxSqlQuery & query) { return static_cast<className &>(qx::QxSqlQuery::isNotEqualTo_Select(query)); } \
  619. \
  620. className & className::isNull() { return static_cast<className &>(qx::QxSqlQuery::isNull()); } \
  621. className & className::isNotNull() { return static_cast<className &>(qx::QxSqlQuery::isNotNull()); } \
  622. \
  623. className & className::isBetween(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::isBetween(val1, val2)); } \
  624. className & className::isNotBetween(const QVariant & val1, const QVariant & val2) { return static_cast<className &>(qx::QxSqlQuery::isNotBetween(val1, val2)); } \
  625. \
  626. className & className::freeText(const QString & text, const QVariantList & values) { return static_cast<className &>(qx::QxSqlQuery::freeText(text, values)); } \
  627. \
  628. className & className::addJoinQuery(const QString & relationKeyOrAlias, const QxSqlQuery & joinQuery) { return static_cast<className &>(qx::QxSqlQuery::addJoinQuery(relationKeyOrAlias, joinQuery)); }
  629. #endif // _QX_SQL_QUERY_H_