Java JPA:如何使用SHA1加密持久化列?
我对JPA(以及扩展的JPQL)相当陌生。希望有人能用这个问题来启发我 我正在尝试执行的查询Java JPA:如何使用SHA1加密持久化列?,java,jpa,jpql,Java,Jpa,Jpql,我对JPA(以及扩展的JPQL)相当陌生。希望有人能用这个问题来启发我 我正在尝试执行的查询 String query = "select u from user u where u.email = '" + userEmail + "' and u.password = sha1('"+ userPassword + "')"; List resultList = emf.createEntityManager().createQuery(query).getResultList(); 我得
String query = "select u from user u where u.email = '" + userEmail + "' and u.password = sha1('"+ userPassword + "')";
List resultList = emf.createEntityManager().createQuery(query).getResultList();
我得到了以下例外
Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query [select u from Utilisateur u where u.email = 'myuser' and u.mot_Passe = sha1('mypassword')], line 1, column 73: unexpected token [(].
Internal Exception: NoViableAltException(83@[()* loopback of 383:9: (d= DOT right= attribute )*])
at org.eclipse.persistence.exceptions.JPQLException.unexpectedToken(JPQLException.java:372)
...
很明显,我在这里遗漏了一些东西,我应该以某种方式逃离这个角色吗?用另一种方式指定它?我将非常感谢您在这方面提供的帮助。通过查询接口设置参数,而不是直接将它们添加到JPQL字符串中。这样,您也可以保护自己免受:
通过查询接口设置参数,而不是直接将其添加到JPQL字符串中。这样,您也可以保护自己免受:
我认为JPA没有sha1函数。所以你有两个选择:
String query = "select u from user u where u.email = :userEmail" +
" and u.password = :userPassword";
Query jpqlQuery = em.createQuery(query)
.setParameter("userEmail", userEmail)
.setParameter("userPassword",sha1(userPassword));
List customers=(List)em.createNativeQuery
(“从客户中选择*”,jpql示例.entities.Customer.class)
.getResultList();
迭代器i=customers.Iterator();
客户客户;
while(i.hasNext()){
cust=(客户)i.next();
//做点什么
}
我认为JPA没有sha1函数。所以你有两个选择:
String query = "select u from user u where u.email = :userEmail" +
" and u.password = :userPassword";
Query jpqlQuery = em.createQuery(query)
.setParameter("userEmail", userEmail)
.setParameter("userPassword",sha1(userPassword));
List customers=(List)em.createNativeQuery
(“从客户中选择*”,jpql示例.entities.Customer.class)
.getResultList();
迭代器i=customers.Iterator();
客户客户;
while(i.hasNext()){
cust=(客户)i.next();
//做点什么
}
在EclipseLink中,可以使用FUNC查询词来使用特定于数据库的函数 “从用户u中选择u,其中u.email=:email,u.password=FUNC('sha1',:password)” 看,,
在EclipseLink中,您可以使用FUNC查询词来使用特定于数据库的函数 “从用户u中选择u,其中u.email=:email,u.password=FUNC('sha1',:password)” 看,,
这将保护我免受SQL注入,我同意。但是,它并没有解决我的原始问题(仍然得到解析异常)。原因是:异常[EclipseLink-8025](Eclipse持久性服务-2.2.0.v20110202-r8913):org.Eclipse.Persistence.exceptions.JPQLException异常描述:解析查询时出现语法错误[从Usilizateur u中选择u,其中u.email=:userEmail和u.password=sha1(:userPassword)],第1行第76列:意外令牌[(]@WardFlores Uhm,JPA有sha1函数吗?因为?谢谢Sean,是的,你是对的,显然JPA不支持sha1函数。谢谢。这将保护我免受SQL注入,我同意。但是,这并不能解决我最初的问题(仍然得到解析异常)。原因:异常[EclipseLink-8025](Eclipse持久性服务-2.2.0.v20110202-r8913):org.Eclipse.Persistence.exceptions.JPQLException异常描述:语法错误解析查询[从Usilisateur u中选择u,其中u.email=:userEmail和u.password=sha1(:userPassword)],第1行,第76列:意外令牌[(]@WardFlores Uhm,JPA有sha1函数吗?谢谢Sean,是的,你是对的,显然JPA不支持sha1函数。谢谢。正如S.P.F所说,你需要在Java代码中计算sha1,然后将其设置为查询的密码参数。正如S.P.F所说,你需要在Java代码中计算sha1,然后将其设置为查询的密码参数。看起来JPA不支持加密哈希函数。感谢您对这些替代方案的建议。在Java上实现sha1函数成功了。非常感谢。看起来JPA不支持加密哈希函数。感谢您对这些替代方案的建议。在Java上实现sha1函数成功了。谢谢太多了。
List<Customer> customers = (List<Customer>)em.createNativeQuery
("SELECT * FROM customers", jpqlexample.entities.Customer.class)
.getResultList();
Iterator i = customers.iterator();
Customer cust;
while (i.hasNext()) {
cust = (Customer) i.next();
//do something
}