diff --git a/engine.go b/engine.go index 8f0c805d..ccb282e0 100644 --- a/engine.go +++ b/engine.go @@ -571,6 +571,13 @@ func (engine *Engine) SetExpr(column string, expression string) *Session { return session.SetExpr(column, expression) } +// Method Options specify the query option +func (engine *Engine) Options(options ...string) *Session { + session := engine.NewSession() + session.IsAutoClose = true + return session.Options(options...) +} + // Temporarily change the Get, Find, Update's table func (engine *Engine) Table(tableNameOrBean interface{}) *Session { session := engine.NewSession() diff --git a/session.go b/session.go index 5fa1ebbe..0edb9f76 100644 --- a/session.go +++ b/session.go @@ -168,6 +168,12 @@ func (session *Session) SetExpr(column string, expression string) *Session { return session } +// Method Options specify the query option +func (session *Session) Options(options ...string) *Session { + session.Statement.Options = options + return session +} + // Method Cols provides some columns to special func (session *Session) Cols(columns ...string) *Session { session.Statement.Cols(columns...) @@ -722,7 +728,7 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr interface{}, args ...interface{}) (err error) { if session.Statement.RefTable == nil || indexNoCase(sqlStr, "having") != -1 || - indexNoCase(sqlStr, "group by") != -1 || + indexNoCase(sqlStr, "group by") != -1 || session.Tx != nil { return ErrCacheFailed } diff --git a/statement.go b/statement.go index b8f85971..0c2e8255 100644 --- a/statement.go +++ b/statement.go @@ -69,6 +69,7 @@ type Statement struct { incrColumns map[string]incrParam decrColumns map[string]decrParam exprColumns map[string]exprParam + Options []string } // init @@ -1308,6 +1309,20 @@ func (statement *Statement) genSelectSql(columnStr string) (a string) { } } + if len(statement.Options) > 0 { + switch statement.Engine.dialect.DBType() { + case core.MYSQL: + for _, option := range statement.Options { + switch option { + case "select:for-update": + a += " FOR UPDATE" + case "select:lock-in-share-mode": + a += " LOCK IN SHARE MODE" + } + } + } + } + return }