gpt4 book ai didi

java - 如果返回类型为 java.sql.Timestamp,则基于接口(interface)的投影 getter 方法给出异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:48 26 4
gpt4 key购买 nike

我正在使用带有 Spirng JPA 的 spring boot strater 2.2.0.BUILD-SNAPSHOT。我需要将一些复杂的 SQL 与一些组一起使用我正在使用基于接口(interface)的投影的 native 查询,我能够检索所有字段但是对于 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;
}

带有投影接口(interface)的存储库接口(interface)

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

有人可以指导我可以做什么吗,我有一个解决方案是更改数据库列名称以匹配实体文件名,但我觉得这是不对的,必须有一些解决方案。

调试屏幕截图

enter image description here

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

屏幕截图

enter image description here

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 的建议下,我将接口(interface)返回类型从 java.sql.Timestamp 更改为 java.sql.Date,它工作正常,因为我的 native sql 返回类型是日期,因为使用了日期函数

因此更改问题标题和详细信息

最佳答案

只需我们将别名与您界面中的名称相匹配即可。不要使用 _ 但 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)

原因:使用 native 查询和接口(interface)投影时,未考虑实体中的列映射。

还要确保接口(interface)的返回类型正确!

关于java - 如果返回类型为 java.sql.Timestamp,则基于接口(interface)的投影 getter 方法给出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56477303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com