我最近刚开始在一家新公司工作,我注意到我们正在以这种方式创建HQL查询(使用字符串连接):
final Query query = em.createQuery("SELECT name FROM Foo foo WHERE email_acct_id = \'"
+ emailAccountId + "\'");
我建议我们将这样的查询更改为:
final Query query = em.createQuery("SELECT name FROM Foo foo WHERE email_acct_id = :email")
.setParameter("email", emailAccountId);
我不想因为我在这里崭露头角而太过摇摇欲坠,所以我需要事实来支持我的建议。这两个查询有什么区别?我认为这与表现有关...
答案 0 :(得分:3)
你应该总是第二个选择的主要原因是安全性。
当您使用第一个选项时,您的应用程序容易受到SQL Injection的攻击。</ p>
后一个选项更安全,因为当您使用它时,驱动程序将在执行查询之前适当地转义参数。查看this文章。