【问题标题】:Define a JPA Repository Native Query with a Join使用联接定义 JPA 存储库本机查询
【发布时间】: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_dateDate 类型,但是在您的查询中您传入了String 2.您的查询方法的返回类型是List&lt;Long&gt;,但应该是List&lt;Travel&gt; 希望这可以进一步帮助您
  • @s.ijpma 这是一个原生查询,所以应该不是问题

标签: java sql spring jpa join


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 2015-03-28
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多