繁体   English   中英

基于接口的投影getter方法在返回类型为java.sql.Timestamp时给出异常

[英]Interface-Based Projections the getter method giving exception if the return type is java.sql.Timestamp

我正在使用带有Spirng JPA的弹簧靴2.2.0.BUILD-SNAPSHOT。 我需要使用一些复杂的SQL和一些我使用基于接口的投影的本机查询,我能够重新获得所有字段但是获得了java.sql.Timestamp的返回类型的异常

示例:我的实体类

@Entity
@Table(name = "trade")
public class Trade {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "trade_id")
private long tradeId;

@Column(name = "symbol")
private String symbol;

@Column(name = "exchange")
private String exchange;

@Column(name = "segment")
private String segment;

@Column(name = "clinet_trade_id")
private long clientTradeId;

@Column(name = "order_id")
private long orderId;

@Column(name = "price")
private double price;

@Column(name = "sell_type")
private String tradeType;

@Column(name = "quantity")
private int quantity;

@Column(name = "trade_date_time")
private Timestamp tradeDateTime;
}

具有投影界面的存储库界面

@Repository("TradeRepository")
public interface TradeRepository extends JpaRepository<Trade, Long> {


// projection

//https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
//Interface-based Projections
//https://www.baeldung.com/spring-data-jpa-projections

@Query(value = "select symbol,date(trade_date_time) as trade_date_time , sum(quantity) as quantity , sum(quantity*price) as price  from trade where sell_type ='sell' \n" + 
        "and trader_date > ?1  and trader_date < ?2 and user_id= ?3 " + 
        "group by symbol, date(trade_date_time) " + 
        "order by symbol, date(trade_date_time) ", nativeQuery = true)
 public List<TradeView> findByNativeQuery(Timestamp fromdate, Timestamp toDate, int userId);

public static interface TradeView {
     public String getSymbol();
     public Timestamp getTradeDateTime();
     public int getQuantity();
     public double getPrice();
  }


}

这里我得到方法getTradeDateTime()异常

消除痕迹

java.lang.IllegalArgumentException: Projection type must be an interface!
at org.springframework.util.Assert.isTrue(Assert.java:118)
at org.springframework.data.projection.ProxyProjectionFactory.createProjection(ProxyProjectionFactory.java:100)
at org.springframework.data.projection.SpelAwareProxyProjectionFactory.createProjection(SpelAwareProxyProjectionFactory.java:45)
at org.springframework.data.projection.ProjectingMethodInterceptor.getProjection(ProjectingMethodInterceptor.java:131)
at org.springframework.data.projection.ProjectingMethodInterceptor.invoke(ProjectingMethodInterceptor.java:80)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.projection.ProxyProjectionFactory$TargetAwareMethodInterceptor.invoke(ProxyProjectionFactory.java:245)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy123.getTradeDateTime(Unknown Source)
at org.cet.stockAnalysis.repository.TradeRepositoryTest.findAllSaleTradeByDateTest(TradeRepositoryTest.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

可以有人指导我可以做什么,我有一个解决方案是更改DB列名称以匹配实体字段名称,但我觉得不对不行,必须有一些解决方案。

调试屏幕截图

在此输入图像描述

注意:我在调用getter方法读取值时遇到异常,那时它也会转到ProxyProjectionFactory第100行,并且那时类型为id java.sql.Timestamp并且会引发异常

Scren开枪

在此输入图像描述

Junit测试类

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class TradeRepositoryTest {

@Autowired
TradeRepository tradeRepository;

@Test
public void findAllSaleTradeByDateTest() {
    Date fromdate = new GregorianCalendar(2019, Calendar.FEBRUARY, 1).getTime();
    Date todate = new GregorianCalendar(2019, Calendar.MARCH, 31).getTime();

    Timestamp fromTimestamp= new Timestamp(fromdate.getTime());
    Timestamp toTimestamp= new Timestamp(todate.getTime());

    User user = new User();
    user.setId(1);
    List<TradeView> tradeviews =tradeRepository.findByNativeQuery(fromTimestamp, toTimestamp, 1);
    System.out.println(tradeviews.get(0).getSymbol());
    System.out.println(tradeviews.get(0).getPrice());
    System.out.println(tradeviews.get(0).getTradeDateTime() +" >>>>>> ");
    System.out.println(tradeviews.get(0).getQuantity());


    assertNotNull(tradeviews);
}

}

编辑:

根据Simon的建议,我将接口返回类型更改为java.sql.Date形式java.sql.Timestamp并且它工作正常,因为我的本机sql返回类型是date,因为使用了日期函数

因此,打开问题标题和细节

我们只需将匹配名称放在界面中。 不要使用_但是tradeDateTime:

@Query(value = "select symbol, date(trade_date_time) as tradeDateTime, sum(quantity) as quantity , sum(quantity*price) as price  from trade where sell_type ='sell' \n" + 
    "and trader_date > ?1  and trader_date < ?2 and user_id= ?3 " + 
    "group by symbol, date(trade_date_time) " + 
    "order by symbol, date(trade_date_time) ", nativeQuery = true)

原因:使用本机查询和界面投影时,不会考虑实体中的列映射。

还要确保接口具有正确的返回类型!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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