【发布时间】:2016-03-13 06:40:10
【问题描述】:
我有一个带有 Class Ride 的 Spring 项目
Entity
@Table(name = "ride")
public class Ride {
@Id
@GeneratedValue
private Long id;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="start_date")
private Date startDate;
@Temporal(TemporalType.TIMESTAMP)
private Date endDate;
private int nbPlaces;
private int price;
public int rank;
@Column(name="departure_country")
private String departureCountry;
@Column(name="departure_city")
private String departureCity;
@Column(name="arrival_country")
private String arrivalCountry;
@Column(name="arrival_city")
private String arrivalCity;
private String appointmentAddress;
@ManyToOne(optional = false)
@JsonIgnore
private Travel travel;
<.....>
}
当我使用原生 sql 查询创建存储库时
public interface RideRepository extends JpaRepository<Ride,Long> {
@Query(value = "SELECT departureQuery.travel FROM (SELECT DISTINCT travel FROM ride WHERE departure_city LIKE %?0% AND start_date > ?2 OR departure_country LIKE %?0% AND start_date > ?2) departureQuery JOIN (SELECT DISTINCT travel FROM ride WHERE arrival_city LIKE %?1% AND start_date > ?2 OR arrival_country LIKE %?1% AND start_date > ?2) arrivalQuery on departureQuery.travel = arrivalQuery.travel", nativeQuery = true)
List<Long> find(String departureCity, String arrivalCity, String date);
}
- 第一个 FROM 带有下划线:需要标识符,得到 '('
- 第二个 SELECT 带有下划线:'SELECT' unexpected
当我尝试部署 war 文件时,我得到了 HTTP 状态 500,
java.lang.IllegalArgumentException: Position must be greater than zero!
org.springframework.util.Assert.isTrue(Assert.java:65)
org.springframework.data.jpa.repository.query.StringQuery$LikeParameterBinding.<init>(StringQuery.java:622)
org.springframework.data.jpa.repository.query.StringQuery$ParameterBindingParser.parseParameterBindingsOfQueryIntoBindingsAndReturnCleanedQuery(StringQuery.java:241)
org.springframework.data.jpa.repository.query.StringQuery$ParameterBindingParser.access$000(StringQuery.java:141)
org.springframework.data.jpa.repository.query.StringQuery.<init>(StringQuery.java:59)
org.springframework.data.jpa.repository.query.ExpressionBasedStringQuery.<init>(ExpressionBasedStringQuery.java:59)
org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.<init>(AbstractStringBasedJpaQuery.java:61)
org.springframework.data.jpa.repository.query.NativeJpaQuery.<init>(NativeJpaQuery.java:46)
org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:72)
org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:53)
org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:135)
org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:203)
org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:72)
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:349)
org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:187)
org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rideRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Position must be greater than zero!
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1021)
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:964)
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:862)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:494)
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:298)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1186)
感谢您的帮助。
【问题讨论】:
-
我注意到的几件事:1.您的实体中的
start_date是Date类型,但是在您的查询中您传入了String2.您的查询方法的返回类型是List<Long>,但应该是List<Travel>希望这可以进一步帮助您 -
@s.ijpma 这是一个原生查询,所以应该不是问题