这是因为GORM在使用&ModelName{}的方式查询时,会将结构体中默认值为0或者NULL的字段忽略掉,不会将其作为WHERE条件。而如果你使用字符串写SQL语句,则可以自由地指定WHERE条件,无论该字段是否为0或NULL都可以进行查询。
举个例子来说,假设有一个User结构体如下:
type User struct {
ID uint
Name string
Age int
}
当你使用以下代码进行查询时:
var user User
db.Where(&User{Name: "John", Age: 0}).First(&user)
GORM会忽略Age字段等于0的记录,只返回符合Name等于”John”的记录。但是如果你使用以下代码进行查询,则可以包含Age等于0的记录:
var users []User
db.Raw("SELECT * FROM users WHERE name = ? AND age <= ?", "John", 0).Scan(&users)
这条语句会将符合条件的所有记录都查询出来,并且不管Age是否为0都不会被忽略掉。因此,在使用GORM进行查询时,需要注意结构体中默认值对查询结果的影响。




