## Release History ### Current Release iciql is undergoing rapid development so api and configuration are subject to change from release to release **%VERSION%** ([zip](http://code.google.com/p/iciql/downloads/detail?name=%ZIP%)|[jar](http://code.google.com/p/iciql/downloads/detail?name=%JAR%))   *released %BUILDDATE%* - Disallow **declaring and explicitly referencing** multiple primitive booleans in a single model.
A runtime exception will be thrown if an attempt to use where/set/on/and/or/groupBy/orderBy(boolean) and your model has multiple mapped primitive boolean fields. - Added list alternatives to the varargs methods because it was too easy to forget list.toArray()
*Db.executeQuery(Class<? extends T> modelClass, String sql, List<?> args)*
*Db.executeQuery(String sql, List<?> args)*
*Query.where(String fragment, List<?> args)*
- Fixed inherited JaQu bug related to model classes and wildcard queries (select *).

Iciql maps resultset columns by the index of the model class field from a list. This assumes that *all* columns in the resultset have a corresponding model field definition. This works fine for most queries because iciql explicitly selects columns from the table (*select alpha, beta...*) when you execute *select()*. The problem is when iciql issues a join or a custom wildcard query and your model does not represent all columns in the resultset: columns and fields fail to correctly line-up.

The fix for this (building a column index from the resultset by column name lookup) breaks selecting into *some* anonymous inner classes. At issue is that the inner class field names must now match the column names or the fields must be explicitly annotated with the column names.

**Example** (notice *IQColumn* annotation)
%BEGINCODE% public static class ProductPrice { public String productName; public String category; @IQColumn(name = "unitPrice") public Double price; } db....select(new ProductPrice() {{ productName = p.productName; category = p.category; // or unitPrice = p.unitPrice; price = p.unitPrice; }} %ENDCODE% ### Older Releases **0.7.3**   *released 2011-12-06* - api change release (API v8) - Fixed JOIN ON primitives - Fixed GROUP BY primitives - Fixed primitive references when selecting into a custom type with primitives - Improved fluent/type-safety of joins **0.7.2**   *released 2011-11-30* - generated models are now serializable with a default serial version id of 1 - Updated to H2 1.3.162 - Updated to HSQL 2.2.6 (100% unit test pass now that [this bug](https://sourceforge.net/tracker/?func=detail&aid=3390047&group_id=23316&atid=378131) was fixed) **0.7.1**   *released 2011-08-31* - api change release (API v7) - Undeprecated interface configuration - Interface configuration now maps ALL fields, not just public fields - Added @IQIgnore annotation to explicitly skip fields for interface configuration - Created additional Define static methods to bring interface configuration to near-parity with annotation configuration - Documented POJO configuration option (limited subset of interface configuration) - Fix to PostgreSQL dialect when creating autoincrement columns - Fix to default dialect when creating autoincrement columns - Added Db.open(url) method **0.7.0**   *released 2011-08-17* - api change release (API v6) - Finished MySQL dialect implementation. MySQL 5.0.51b passes 100% of tests. - Added PostgreSQL dialect. PostgreSQL 9.0 passes all but the boolean-as-int tests. - Added Db.dropTable(T) method - Overhauled test suite and included more database configurations. - Renamed StatementLogger to IciqlLogger - Added IciqlLogger.warn method - Added IciqlLogger.drop method **0.6.6**   *released 2011-08-15* - api change release (API v5) - Disabled two concurrency unit tests since I believe they are flawed and do not yield reproducible results - Added Derby database dialect. Derby 10.7.1.1 and 10.8.1.2 pass 100% of tests. - Implemented HSQL MERGE syntax. HSQL 2.2.4 fails 1 test which is a known [bug in HSQL](https://sourceforge.net/tracker/?func=detail&aid=3390047&group_id=23316&atid=378131) - Updated to H2 1.3.159 **0.6.5**   *released 2011-08-12* - fixed failure of db.delete(PrimitiveModel) and db.update(PrimitiveModel) **0.6.4**   *released 2011-08-12* - api change release (API v4) - @IQTable.createIfRequired -> @IQTable.create - don't INSERT primitive autoIncrement fields, let database assign value - full support for primitives in all clauses - DECIMAL(length, scale) support - unspecified length String fields are now CLOB instead of TEXT. dialects can intercept this and convert to another type. e.g. MySQL dialect can change CLOB to TEXT. - java.lang.Boolean now maps to BOOLEAN instead of BIT - expressions on unmapped fields will throw an IciqlException - expressions on unsupported types will throw an IciqlException - improved exception reporting by including generated statement, if available - moved dialects back to main package - improved automatic dialect determination on pooled connections - moved create table and create index statement generation into dialects - added HSQL dialect. HSQL fails 4 out of 50 unit tests. - 2 failures are unimplemented merge - 1 has been filed and accepted as a [bug in HSQL](https://sourceforge.net/tracker/?func=detail&aid=3390047&group_id=23316&atid=378131) - 1 is a concurrency issue, but the test may be flawed - added untested MySQL dialect - renamed _ iq_versions table to *iq_versions* since leading _ character is troublesome for some databases. - @IQColumn(allowNull=true) -> @IQColumn(nullable=true) - All **Object** columns are assumed NULLABLE unless explicitly set *@IQColumn(nullable = false)* - All **Primitive** columns are assumed NOT NULLABLE unless explicitly set *@IQColumn(nullable = true)* - allow using objects to assign default values
%BEGINCODE% // CREATE TABLE ... myDate DATETIME DEFAULT '2000-02-01 00:00:00' @IQColumn Date myDate = new Date(100, 1, 1); %ENDCODE% - changed @IQTable.primaryKey definition to use array of column names
%BEGINCODE% @IQTable( primaryKey = {"name", "nickname"}) %ENDCODE% **0.6.3**   *released 2011-08-08* - api change release (API v3) - finished enum support (issue 4) - added UUID type support (H2 databases only) - added partial primitives support *(primitives may not be used for compile-time condition clauses)* - added *between(A y).and(A z)* condition syntax - moved dialects into separate package **0.6.2**   *released 2011-08-05* - api change release (API v2) - fix to versioning to support H2 1.3.158+ - added BLOB support (issue 1) - added java.lang.Enum support (issue 2) - allow runtime flexible mapping of BOOL columns to Integer fields - allow runtime flexible mapping of INT columns to Boolean fields - annotations overhaul to reduce verbosity - @IQSchema(name="public") -> @IQSchema("public") - @IQDatabase(version=2) -> @IQVersion(2) - @IQTable(version=2) -> @IQVersion(2) - @IQIndex annotation simplified to be used for one index definition and expanded to specify index name - added @IQIndexes annotation to specify multiple IQIndex annotations
%BEGINCODE% @IQIndexes({ @IQIndex("name"), @IQIndex(name="myindexname" value={"name", "nickname"}) }) %ENDCODE% - @IQColumn(maxLength=20) -> @IQColumn(length=20) - @IQColumn(trimString=true) -> @IQColumn(trim=true) **0.5.0**   *released 2011-08-03* - initial release (API v1) *API changes compared to JaQu from H2 1.3.157 sources* - deprecated model class interface configuration - added *Db.open(Connection conn)* method, changed constructor to default scope - added *Db.registerDialect* static methods to register custom dialects - added *Query.where(String fragment, Object... args)* method to build a runtime query fragment when compile-time queries are too strict - added *Db.executeQuery(String query, Object... args)* to execute a complete sql query with optional arguments - added *Db.executeQuery(Class modelClass, String query, Object... args)* to execute a complete sql query, with optional arguments, and build objects from the result - added *Db.buildObjects(Class modelClass, ResultSet rs)* method to build objects from the ResultSet of a plain sql query - added *ThreadLocal<T> com.iciql.Utils.newThreadLocal(final Class<? extends T> clazz)* method - added optional console statement logger and SLF4J statement logger - refactored dialect support - throw *IciqlException* (which is a RuntimeException) instead of RuntimeException - synchronized *Db.classMap* for concurrent sharing of a Db instance - Database/table versioning uses the _iq_versions table, the _ jq_versions table, if present, is ignored - Changed the following class names: - org.h2.jaqu.Table => com.iciql.Iciql - org.h2.jaqu.JQSchema => com.iciql.IQSchema - org.h2.jaqu.JQDatabase => com.iciql.IQDatabase - org.h2.jaqu.JQIndex => com.iciql.IQIndex - org.h2.jaqu.JQTable => com.iciql.IQTable - org.h2.jaqu.JQColumn => com.iciql.IQColumn - Changed the following method names: - org.h2.jaqu.Table.define() => com.iciql.Iciql.defineIQ() - QueryConditon.bigger => QueryCondition.exceeds - QueryConditon.biggerEqual => QueryCondition.atLeast - QueryConditon.smaller => QueryCondition.lessThan - QueryConditon.smallEqual => QueryCondition.atMost