我正在尝试使用相同的查询对表列进行排序,但是当我将列作为参数传递给ORDER BY时,它会在列名前后添加引号。如果使用ORDER BY参数,则必须在不引用引号之间写入列名,否则MySQL将忽略它。
要执行的示例或查询:
select * from app_user ORDER BY mobile_token ASC LIMIT 0 , 20
这是hibernate发送给MySQL的内容:
select * from app_user ORDER BY 'mobile_token' ASC LIMIT 0 , 20
Java查询:
query = JPA.em().createNativeQuery("select * from app_user ORDER BY :column ASC LIMIT :init , :page",AppUser.class);
query.setParameter("column", column);
query.setParameter("init", pageNumber*pageSize);
query.setParameter("page", pageSize);
我可以通过以下方式更改NativeQuery:
"select * from app_user ORDER BY "+column+" ASC LIMIT :init , :page"
但这将成为我的应用程序不安全。
答案 0 :(得分:2)
您只能将值作为参数传递给查询。不是列名或字段名。这将使数据库无法知道查询中实际使用了哪些列,从而无法准备执行计划。
所以使用串联的解决方案是唯一的解决方案。只需确保该列不是来自用户。或者,如果它来自用户,则它是有效的列名,并且允许用户使用它。