Java 如何在eclipselink@Query注释中使用表达式(SpEL)?
如何在Spring Data JPA repository方法的@query方法中的JPA查询中添加条件where子句 比如说,Java 如何在eclipselink@Query注释中使用表达式(SpEL)?,java,spring,eclipselink,spring-data,Java,Spring,Eclipselink,Spring Data,如何在Spring Data JPA repository方法的@query方法中的JPA查询中添加条件where子句 比如说, @Query("select student from Student student #{:rollNumber == '123' ? 'where student.rollNumber > 123' : ''} ") List<Student> findStudents(@Param("rollNumber") int rollNumber)
@Query("select student from Student student #{:rollNumber == '123' ? 'where student.rollNumber > 123' : ''} ")
List<Student> findStudents(@Param("rollNumber") int rollNumber)
我得到以下例外情况:-
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing [select student from Student student #{:rollNumber == '123' ? 'where student.rollNumber > 123' : ''} ].
[62, 63] The FROM clause has 'Student student' and '#{:rollNumber =' that are not separated by a comma.
[104, 105] The identification variable '=' cannot be a reserved word.
[105, 172] The query contains a malformed ending.
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1603)
... 74 more
我不确定spring数据当前是否将查询参数注入SpeL解析器。 您可以尝试以下方法:
@Query("select student from Student student where :rollNumber==123 or student.rollNumber > 123 ")
List<Student> findStudents(@Param("rollNumber") int rollNumber)
您需要使用?1将rollNumber注入查询。?1或:paramName是一个相同的东西。Spring支持命名参数。这不会返回卷号小于123的学生。当rollNumber为123时,我需要完整的列表。如果您使用123作为参数计算函数,则roll numberIt的任何其他条件都会重新计算所有学生。比较where子句第一部分的参数和常量的小技巧。若参数不是123,那个么它将为您提供rollNumber>123的所有学生。不是很优雅的解决方案。它应该在1.7.2之后出现-