11---
22title : SQL Dialects
3- nav_order : 7
4- description : " SqlDialect, SqlResult, AbstractSqlDialect, and the dialect matrix"
3+ nav_order : 6
4+ has_children : true
5+ permalink : /sql-dialects/
6+ description : " SqlDialect, SqlResult, AbstractSqlDialect, and the dialect comparison matrix"
57---
68
79# SQL Dialects
@@ -18,52 +20,31 @@ description: "SqlDialect, SqlResult, AbstractSqlDialect, and the dialect matrix"
1820## Overview
1921
2022` SqlDialect ` is a strategy interface that converts a ` Query ` object into a
21- parameterized ` SqlResult ` . Three built-in dialects are provided as constants
23+ parameterized ` SqlResult ` . Four built-in dialects are provided as constants
2224on the interface:
2325
24- | Constant | Identifier quoting | DELETE LIMIT | ILIKE | RETURNING |
25- | ----------| --------------------| --------------| ------| ----------|
26- | ` SqlDialect.STANDARD ` | None (ANSI) | Not supported | No | No |
27- | ` SqlDialect.MYSQL ` | Back-tick `` ` `` | Supported | No | No |
28- | ` SqlDialect.SQLITE ` | Double-quote ` " ` | Supported | No | No |
29- | ` SqlDialect.POSTGRESQL ` | Double-quote ` " ` | Not supported | Yes | Yes (DELETE) |
26+ | Constant | Page | Identifier quoting | DELETE LIMIT | ILIKE | RETURNING |
27+ | ----------| ------| -------------------- | --------------| ------- | - ----------|
28+ | ` SqlDialect.STANDARD ` | [ STANDARD ] ({{ site.baseurl }}/sql-dialects/standard/) | None (ANSI) | No | No | No |
29+ | ` SqlDialect.MYSQL ` | [ MySQL ] ({{ site.baseurl }}/sql-dialects/mysql/) | Back-tick `` ` `` | Yes | No | No |
30+ | ` SqlDialect.SQLITE ` | [ SQLite ] ({{ site.baseurl }}/sql-dialects/sqlite/) | Double-quote ` " ` | Yes | No | No |
31+ | ` SqlDialect.POSTGRESQL ` | [ PostgreSQL ] ({{ site.baseurl }}/sql-dialects/postgresql/) | Double-quote ` " ` | No | Yes | Yes (DELETE) |
3032
3133---
3234
33- ## Using a dialect
35+ ## Dialect matrix
3436
35- Pass a dialect to ` buildSql() ` on the builder:
37+ The same ` Query ` produces different SQL across dialects due to identifier
38+ quoting:
3639
37- ``` java
38- // Standard ANSI
39- SqlResult r1 = new QueryBuilder ()
40- .from(" users" )
41- .whereEquals(" id" , 1 )
42- .buildSql();
43- // → SELECT * FROM users WHERE id = ?
44-
45- // MySQL: back-tick quoted identifiers
46- SqlResult r2 = new QueryBuilder ()
47- .from(" users" )
48- .whereEquals(" id" , 1 )
49- .buildSql(SqlDialect . MYSQL );
50- // → SELECT * FROM `users` WHERE `id` = ?
51-
52- // SQLite: double-quoted identifiers
53- SqlResult r3 = new QueryBuilder ()
54- .from(" users" )
55- .whereEquals(" id" , 1 )
56- .buildSql(SqlDialect . SQLITE );
57- // → SELECT * FROM "users" WHERE "id" = ?
58-
59- // PostgreSQL: double-quoted identifiers + ILIKE support
60- SqlResult r4 = new QueryBuilder ()
61- .from(" users" )
62- .whereILike(" email" , " alice" )
63- .buildSql(SqlDialect . POSTGRESQL );
64- // → SELECT * FROM "users" WHERE "email" ILIKE ?
65- // Parameters: ["%alice%"]
66- ```
40+ | Feature | STANDARD | MYSQL | SQLITE | POSTGRESQL |
41+ | ---------| ----------| -------| --------| ------------|
42+ | Table quoting | ` users ` | `` `users` `` | ` "users" ` | ` "users" ` |
43+ | Column quoting | ` id ` | `` `id` `` | ` "id" ` | ` "id" ` |
44+ | DELETE LIMIT | No | Yes | Yes | No |
45+ | ILIKE / NOT ILIKE | No | No | No | Yes |
46+ | RETURNING on DELETE | No | No | No | Yes |
47+ | Parameter syntax | ` ? ` | ` ? ` | ` ? ` | ` ? ` |
6748
6849---
6950
@@ -93,51 +74,6 @@ List<Object> params = result.getParameters();
9374
9475---
9576
96- ## Rendering DELETE statements
97-
98- Use ` renderDelete(Query) ` on a dialect instance to produce ` DELETE FROM ... `
99- statements. This respects the ` LIMIT ` clause on dialects that support it and
100- the ` RETURNING ` clause on PostgreSQL.
101-
102- ``` java
103- Query q = new QueryBuilder ()
104- .from(" sessions" )
105- .whereEquals(" expired" , true )
106- .limit(500 )
107- .build();
108-
109- // Standard: LIMIT ignored
110- SqlResult std = SqlDialect . STANDARD. renderDelete(q);
111- // → DELETE FROM sessions WHERE expired = ?
112-
113- // MySQL: LIMIT honored
114- SqlResult my = SqlDialect . MYSQL. renderDelete(q);
115- // → DELETE FROM `sessions` WHERE `expired` = ? LIMIT 500
116-
117- // SQLite: LIMIT honored
118- SqlResult sq = SqlDialect . SQLITE. renderDelete(q);
119- // → DELETE FROM "sessions" WHERE "expired" = ? LIMIT 500
120- ```
121-
122- For PostgreSQL ` RETURNING ` , use ` DeleteBuilder.returning() ` — see [ DML Builders] ( dml-builders#returning-clause-postgresql ) .
123-
124- ---
125-
126- ## Dialect matrix
127-
128- The same ` Query ` produces different SQL across dialects due to identifier quoting:
129-
130- | Feature | STANDARD | MYSQL | SQLITE | POSTGRESQL |
131- | ---------| ----------| -------| --------| ------------|
132- | Table quoting | ` users ` | `` `users` `` | ` "users" ` | ` "users" ` |
133- | Column quoting | ` id ` | `` `id` `` | ` "id" ` | ` "id" ` |
134- | DELETE LIMIT | No | Yes | Yes | No |
135- | ILIKE / NOT ILIKE | No | No | No | Yes |
136- | RETURNING on DELETE | No | No | No | Yes |
137- | Parameter syntax | ` ? ` | ` ? ` | ` ? ` | ` ? ` |
138-
139- ---
140-
14177## AbstractSqlDialect
14278
14379` AbstractSqlDialect ` implements the shared rendering logic for SELECT and DELETE
0 commit comments