Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java和Hibernate按特定列排序MySQL查询?_Java_Mysql_Hibernate_Sql Order By - Fatal编程技术网

如何使用Java和Hibernate按特定列排序MySQL查询?

如何使用Java和Hibernate按特定列排序MySQL查询?,java,mysql,hibernate,sql-order-by,Java,Mysql,Hibernate,Sql Order By,我试图使用相同的查询对表列进行排序,但当我将要排序的列作为参数传递时,它会在我的列名前后添加引号。如果您使用的是ORDERBY参数,那么列名必须写在引号之间,否则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 ,

我试图使用相同的查询对表列进行排序,但当我将要排序的列作为参数传递时,它会在我的列名前后添加引号。如果您使用的是ORDERBY参数,那么列名必须写在引号之间,否则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"

但这将成为我的应用程序的不安全问题。

您只能将值作为参数传递给查询。不是列或字段名。这将使数据库无法知道查询中实际使用了哪些列,从而无法准备执行计划


因此,使用串联的解决方案是唯一的解决方案。只要确保该列不是来自用户。或者,如果它来自用户,则表明它是一个有效的列名,并且允许用户使用它。

没错,在检查列名是否是有效的列名时,我没有考虑到这一点。这样做很安全。谢谢