diff --git a/builder/builder.go b/builder/builder.go index 0dc447b..8295a15 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -474,16 +474,36 @@ func NamedQuery(sql string, data map[string]interface{}) (string, []interface{}, err = fmt.Errorf("%s not found", paramName) return "" } + v := reflect.ValueOf(val) - if v.Type().Kind() != reflect.Slice { - vals = append(vals, val) - return paramPlaceHolder + if v.Type().Kind() == reflect.Slice { + length := v.Len() + for i := 0; i < length; i++ { + vals = append(vals, v.Index(i).Interface()) + } + return createMultiPlaceholders(length) } - length := v.Len() - for i := 0; i < length; i++ { - vals = append(vals, v.Index(i).Interface()) + + if v.Type().Kind() == reflect.Map { + where, ok := val.(map[string]interface{}) + if !ok { + err = fmt.Errorf("%s not expected map", paramName) + return "" + } + + conditions, errLocal := getWhereConditions(where, defaultIgnoreKeys) + if errLocal != nil { + err = errLocal + return "" + } + + whereString, whereVals := whereConnector("AND", conditions...) + vals = append(vals, whereVals...) + return whereString } - return createMultiPlaceholders(length) + + vals = append(vals, val) + return paramPlaceHolder }) if nil != err { return "", nil, err diff --git a/builder/builder_test.go b/builder/builder_test.go index 54ae426..9cf4b49 100644 --- a/builder/builder_test.go +++ b/builder/builder_test.go @@ -749,6 +749,21 @@ func TestNamedQuery(t *testing.T) { vals: []interface{}{"f1", "f2", 10, "beijing", "shanghai", "chengdu"}, err: nil, }, + { + sql: `select {{foo}},{{bar}} from tb where address in {{addr}} and {{where}}`, + data: map[string]interface{}{ + "foo": "f1", + "bar": "f2", + "addr": []string{"beijing", "shanghai", "chengdu"}, + "where": map[string]interface{}{ + "name in": []string{"1", "2"}, + "age": 10, + }, + }, + cond: `select ?,? from tb where address in (?,?,?) and (age=? AND name IN (?,?))`, + vals: []interface{}{"f1", "f2", "beijing", "shanghai", "chengdu", 10, "1", "2"}, + err: nil, + }, } ass := assert.New(t) for _, tc := range testData {