package jef.database.jsqlparser.expression;
/**
* 描述在NamedQuery中允许出现的数据类型
* <h3>作用</h3>
* 标准SQL中定义绑定变量的方式如下{@code
* select * from foo where id=? and name=?
* }
* EF框架中,{@linkplain jef.database.NativeQuery 对SQL语句进行了增强},
* 其中有一项重要特性就是,可以在SQL语句中指定参数(绑定变量)的类型。
*
* <h3>枚举一览</h3>
* <table BORDER CELLPADDING=3 CELLSPACING=1>
* <tr><td>类型名</td><td>效果</td></tr>
* <tr><td>{@link #DATE}</td><td>参数将被转换为java.sql.Date</td></tr>
* <tr><td>{@link #TIMESTAMP}</td><td>参数将被转换为java.sql.Timestamp</td></tr>
* <tr><td>{@link #INT}</td><td>参数将被转换为int</td></tr>
* <tr><td>{@link #STRING}</td><td>参数将被转换为string</td></tr>
* <tr><td>{@link #LONG}</td><td>参数将被转换为long</td></tr>
* <tr><td>{@link #SHORT}</td><td>参数将被转换为short</td></tr>
* <tr><td>{@link #FLOAT}</td><td>参数将被转换为float</td></tr>
* <tr><td>{@link #DOUBLE}</td><td>参数将被转换为double</td></tr>
* <tr><td>{@link #BOOLEAN}</td><td>参数将被转换为boolean</td></tr>
* <tr><td>{@link #STRING$}</td><td>参数将被转换为string,并且后面加上%,一般用于like xxx% 的场合</td></tr>
* <tr><td>{@link #$STRING$}</td><td>参数将被转换为string,并且两端加上%,一般用于like %xxx% 的场合</td></tr>
* <tr><td>{@link #$STRING}</td><td>参数将被转换为string,并且前面加上%,一般用于like %xxx 的场合</td></tr>
* <tr><td>{@link #SQL}</td><td>SQL片段。参数将直接作为SQL语句的一部分,而不是作为SQL语句的绑定变量处理</td></tr>
* </table>
* 上面的STRING$、$STRING$、$STRING三种参数转换,其效果是将$符号替换为%,主要用于从WEB页面传输模糊匹配的查询条件到后台。使用该数据类型后,%号的添加交由框架自动处理。<br>
*
* <h3>用法1: 自动将参数转换为SQL语句需要的类型</h3>
* 可以编写这样一句SQL。
* <pre><tt>NativeQuery<Person> query=session.createNativeQuery(
* "select * from person where age between :minAge<int> and :maxAge<int>", Person.class);</tt></pre>
* 如果不提示{@code minAge}和{@code maxAge}的 数据类型,那么在使用该查询时,我们必须<p>
* {@code query.setParam("minAge", Integer.parseInt(maxString))}; //必须确保设置的参数类型为数值类型。
* <p>
* 但如果在SQL语句中指定了参数的类型,那么EF_ORM在执行语句时就会检查参数类型,并自动将传入的参数转换为需要的SQL类型,这将在一定程度上简化开发工作。
*
* <h3>用法2: Like语句中,自动补充条件两端的百分号</h3>
* <p>
* <pre><tt>NativeQuery<Person> query=session.createNativeQuery(
* "select * from person where name like :name<$string$>", Person.class);
* query.setParam("name","Smith");
* //执行时的实际SQL为select * from person where name like '%Smith%'。即解决了Like语句通配符的问题。
* query.getResultList();
* </tt></pre>
* 详见<ul>
* <li>{@linkplain JpqlDataType#$STRING $STRING类型}</li>
* <li>{@linkplain JpqlDataType#$STRING$ $STRING$类型}</li>
* <li>{@linkplain JpqlDataType#STRING$ STRING$类型}</li>
* </ul>
*
* <h3>用法3: SQL片段,将参数直接拼接到SQL语句中</h3>
* {@code
* select from :tablename<sql> where id > 100
* }
* <p>当输入参数为keyword="FOO"时,实际产生的SQL语句为<p>
* {@code
* select * from FOO where id > 100
* }<br>
* 也就是说,在SQL语句中的表名、列名、Join条件等非绑定变量,也可以动态的拼接到SQL语句当中。<br>
* 参见 {@link #SQL}
*/
public enum JpqlDataType {
/**
* java.sql.Date类型的SQL参数
*/
DATE,
/**
* java.sql.Timestamp类型的SQL参数
*/
TIMESTAMP,
/**
* int类型的SQL参数
*/
INT,
/**
* string类型的SQL参数
*/
STRING,
/**
* long类型的SQL参数
*/
LONG,
/**
* short类型的SQL参数
*/
SHORT,
/**
* Float类型的sql参数
*/
FLOAT,
/**
* Bouble类型的SQL参数
*/
DOUBLE,
/**
* Boolean类型的SQL参数
*/
BOOLEAN,
/**
* SQL表达式类型的参数,传入参数必须是合法的SQL表达式。
* <h3>示例1</h3>
* {@code
* select * from foo where name like :keyword<sql>
* }
* <p>当输入参数为keyword="'Sm%ith'"时,实际产生的SQL语句为<p>
* {@code
* select * from foo where name like 'Sm%ith'
* }
*
* <h3>示例2</h3>
* {@code
* select from :tablename<sql> where id > 100
* }
* <p>当输入参数为keyword="FOO"时,实际产生的SQL语句为<p>
* {@code
* select * from FOO where id > 100
* }
* 也就是说,在SQL语句中的表名、列名、Join条件等非绑定变量,也可以动态的拼接到SQL语句当中。<br>
* 这个特性让命名查询可以将固定不变的SQL部分确定下来,进一步提高了框架的灵活性。
*
*/
SQL,
/**
* String类型的参数,并且会自动在String后面增加%,形成 'string%'这样的表达式。<br>
* 一般用与描述Like条件。
* <h3>示例</h3>
* {@code
* select * from foo where name like :keyword<string$>
* }
* <p>当输入参数为keyword="Smith"时,实际产生的SQL语句为<p>
* {@code
* select * from foo where name like 'Smith%'
* }
*/
STRING$,
/**
* String类型的参数,并且会自动在String前面和后面增加%,形成 '%string%'这样的表达式。<br>
* 一般用与描述Like条件。
* <h3>示例</h3>
* {@code
* select * from foo where name like :keyword<$string$>
* }
* <p>当输入参数为keyword="Smith"时,实际产生的SQL语句为<p>
* {@code
* select * from foo where name like '%Smith%'
* }
*/
$STRING$,
/**
* String类型的参数,并且会自动在String前面增加%,形成 '%string'这样的表达式。<br>
* 一般用与描述Like条件。
* <h3>示例</h3>
* {@code
* select * from foo where name like :keyword<$string>
* }
* <p>当输入参数为keyword="Smith"时,实际产生的SQL语句为<p>
* {@code
* select * from foo where name like '%Smith'
* }
*/
$STRING
}