Skip to content

Issue with interface projection for a native postgres query [DATAJPA-1482] #1798

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
spring-projects-issues opened this issue Dec 11, 2018 · 3 comments
Assignees
Labels
in: core Issues in core support status: invalid An issue that we don't feel is valid type: bug A general bug

Comments

@spring-projects-issues
Copy link

Thomas Lang opened DATAJPA-1482 and commented

I have this repository:

public interface IRentalRepository extends CrudRepository<Rental, Long> {

    @Query(value = "select r.returndate as returnDate from rental r where r.returndate >= ?1 order by r.returndate asc limit 1", nativeQuery = true)
    RentalProjection findsMostRecentReturnDateAndTimeRankByLaboratory(LocalDate localDate);

    @Query(value = "select r.returndate as returnDateNative from rental r where r.returndate >= ?1 order by r.returndate asc limit 1", nativeQuery = true)
    RentalProjection findsMostRecentReturnDateNativeAndTimeRankByLaboratory(LocalDate localDate);

}

I have this projection interface:

public interface RentalProjection {
    LocalDate getReturnDate();

    String getReturnDateNative();

}

Both queries do run indeed, but if i want to access the property

LocalDate getReturnDate();

it (hibernate/spring data jpa) gives me the following exception:

java.lang.IllegalArgumentException: Projection type must be an interface!

When i´m accessing the property

String getReturnDateNative();

everything is fine.

I don´t really know if this is even Spring Data JPA related?
Maybe you could check this out?
Please see this repository with all the tests in it to show the case:
https://github.com/THD-Thomas-Lang/projection-issue

Thank you for your help and work!
Your greatest fan from lower bavaria :)
Thomas

Please see here the stack trace:

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.$Proxy101.getReturnDate(Unknown Source)
	at de.thd.issue.IssueApplicationTests.issueShowCaseFailing(IssueApplicationTests.java:50)
	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.testcontainers.containers.FailureDetectingExternalResource$1.evaluate(FailureDetectingExternalResource.java:30)
	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Affects: 2.1.3 (Lovelace SR3)

Reference URL: https://github.com/THD-Thomas-Lang/projection-issue

Issue Links:

  • DATACMNS-1452 Make the ConversionsService used in ProjectingMethodInterceptor configurable
    ("depends on")
@spring-projects-issues
Copy link
Author

Jens Schauder commented

The problem is that the query returns a Timestamp which can't get converted to the requested LocalDate by the DefaultConversionService.

So as a quick workaround returning a Timestamp should make the method work

@schauder
Copy link
Contributor

schauder commented Mar 1, 2021

Can you please retest with the latest milestone?

@gregturn
Copy link
Contributor

Closing this since the apparent issue is improper types in the project interface.

@gregturn gregturn self-assigned this Sep 30, 2022
@gregturn gregturn added the status: invalid An issue that we don't feel is valid label Sep 30, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: core Issues in core support status: invalid An issue that we don't feel is valid type: bug A general bug
Projects
None yet
Development

No branches or pull requests

3 participants