简体   繁体   中英

Define a JPA Repository Native Query with a Join

I have a Spring project with the Class Ride

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;
    <.....>    
}

When i create the Repository with a native sql query

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);

} 
  • The first FROM is underlined : identifier expected, got '('
  • The second SELECT is underlined : 'SELECT' unexpected

when i try to deploy the war file i got HTTP Status 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)

Thanks for any help.

查询参数的索引从1开始,而不是0。将“ LIKE%?0%”更改为“ LIKE%?1%”

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM