001
014
015 package com.liferay.portal.dao.orm.hibernate;
016
017 import com.liferay.portal.kernel.util.StringBundler;
018 import com.liferay.portal.kernel.util.StringPool;
019 import com.liferay.portal.kernel.util.StringUtil;
020
021
026 public class DB2Dialect extends org.hibernate.dialect.DB2Dialect {
027
028 public DB2Dialect() {
029 registerKeyword("for");
030 registerKeyword("optimize");
031 }
032
033 @Override
034 public String getForUpdateString() {
035 return " for read only with rs use and keep exclusive locks";
036 }
037
038 @Override
039 public String getLimitString(String sql, int offset, int limit) {
040 boolean hasOffset = false;
041
042 if ((offset > 0) || forceLimitUsage()) {
043 hasOffset = true;
044 }
045
046 StringBundler sb = null;
047
048 if (hasOffset) {
049 sb = new StringBundler(11);
050 }
051 else {
052 sb = new StringBundler(5);
053 }
054
055 if (!hasOffset) {
056 addQueryForLimitedRows(sb, sql, limit);
057 addOptimizeForLimitedRows(sb, limit);
058
059 return sb.toString();
060 }
061
062
063
064 sb.append("SELECT outerQuery.* FROM (");
065
066
067
068 sb.append("SELECT innerQuery.*, ");
069 sb.append("ROW_NUMBER() OVER() AS rowNumber_ FROM (");
070
071 addQueryForLimitedRows(sb, sql, limit);
072
073 sb.append(") AS innerQuery");
074
075
076
077 sb.append(") AS outerQuery WHERE rowNumber_ > ");
078 sb.append(offset);
079
080 addOptimizeForLimitedRows(sb, limit);
081
082 return sb.toString();
083 }
084
085 @Override
086 public boolean supportsVariableLimit() {
087 return _SUPPORTS_VARIABLE_LIMIT;
088 }
089
090 protected void addOptimizeForLimitedRows(StringBundler sb, int limit) {
091 sb.append(StringPool.SPACE);
092 sb.append(
093 StringUtil.replace(
094 _SQL_OPTIMIZE_FOR_LIMITED_ROWS, "[$LIMIT$]",
095 String.valueOf(limit)));
096 }
097
098 protected void addQueryForLimitedRows(
099 StringBundler sb, String sql, int limit) {
100
101 sb.append(sql);
102 sb.append(StringPool.SPACE);
103 sb.append(
104 StringUtil.replace(
105 _SQL_FETCH_FIRST_LIMITED_ROWS_ONLY, "[$LIMIT$]",
106 String.valueOf(limit)));
107 }
108
109 private static final String _SQL_FETCH_FIRST_LIMITED_ROWS_ONLY =
110 "FETCH FIRST [$LIMIT$] ROWS ONLY";
111
112 private static final String _SQL_OPTIMIZE_FOR_LIMITED_ROWS =
113 "OPTIMIZE FOR [$LIMIT$] ROWS";
114
115 private static final boolean _SUPPORTS_VARIABLE_LIMIT = false;
116
117 }