Brak convertera typu encji UUID do listy

Brak convertera typu encji UUID do listy
SA
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:94
1

Przy mapowaniu na encje jest rzucany taki wyjątek:

Kopiuj
org.jooq.exception.DataTypeException: No Converter found for types java.util.UUID and java.util.List
	at org.jooq.impl.Tools.converterOrFail(Tools.java:1208) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.Tools.converterOrFail(Tools.java:1217) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.AbstractRecord.get(AbstractRecord.java:351) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.DefaultRecordMapper$ImmutablePOJOMapper.set(DefaultRecordMapper.java:1146) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.DefaultRecordMapper$ImmutablePOJOMapper.mapNonnested(DefaultRecordMapper.java:1137) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.DefaultRecordMapper$ImmutablePOJOMapper.map(DefaultRecordMapper.java:1124) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.DefaultRecordMapper.map(DefaultRecordMapper.java:610) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.DelayedRecordMapper.map(DelayedRecordMapper.java:69) ~[jooq-3.15.0.jar:na]
	at org.jooq.RecordMapper.apply(RecordMapper.java:80) ~[jooq-3.15.0.jar:na]
	at org.jooq.RecordMapper.apply(RecordMapper.java:65) ~[jooq-3.15.0.jar:na]
	at java.base/java.util.stream.Collectors.lambda$mapping$13(Collectors.java:469) ~[na:na]
	at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) ~[na:na]
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[na:na]
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[na:na]
	at org.jooq.impl.AbstractCursor.collect(AbstractCursor.java:78) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.ResultQueryTrait.collect(ResultQueryTrait.java:358) ~[jooq-3.15.0.jar:na]
	at org.jooq.impl.ResultQueryTrait.fetchInto(ResultQueryTrait.java:1423) ~[jooq-3.15.0.jar:na]
	at com.example.jooqsample.posts.JOOQPostRepository.getAll(JOOQPostRepository.java:45) ~[classes/:na]
	at com.example.jooqsample.posts.PostFacade.getAllPosts(PostFacade.java:34) ~[classes/:na]
	at com.example.jooqsample.posts.rest.PostController.getAllPosts(PostController.java:27) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:670) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.23.jar:5.3.23]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.68.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.23.jar:5.3.23]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.23.jar:5.3.23]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
	at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

Encje:

Kopiuj
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Getter
@ToString
@EqualsAndHashCode(of = "id")
class Post {

        private UUID id;

        private String content;

        private Instant createdAt;

        private List<Comment> comments;

    PostDTO toDTO() {
        return PostDTO
                .builder()
                .id(this.id)
                .content(this.content)
                .comments(this.comments.stream().map(Comment::toDTO).toList())
                .build();
    }
}

@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Getter
@ToString
@EqualsAndHashCode(of = "id")
class Comment {
        private UUID id;

        private String content;

        private Instant createdAt;

        UUID postId;

    CommentDTO toDTO() {
        return new CommentDTO(this.id, this.content);
    }
}

Metoda:

Kopiuj
public List<Post> getAll() {
  return dslContext
    .select()
    .from(POSTS)
    .leftJoin(COMMENTS)
    .onKey()
    .fetchInto(Post.class);
}
edytowany 3x, ostatnio: Riddle
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
5

@_13th_Dragon: by napisał:
którego słowa nie rozumiesz w treści wyjatku ?


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
SA
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:94
0
ZrobieDobrze napisał(a):

@_13th_Dragon: by napisał:
którego słowa nie rozumiesz w treści wyjatku ?

Wszystkie rozumiem tylko nie wiem co robić dalej.

ZD
Jak bym zrobił próbę bez lombooka ... z wielu powodów, np ew skutecznie postawił breakointy
ZD
Po drugie bym zaryzykował utratę twarzy przed samym sobą (he he), i użył ordynardego for() zamiast wyrafinowanej lambdy
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:18 dni
3

Zawsze naprawienie błędów idzie jednym z trzech torów:
__ 0. Usuń wszystko i zrób po ludzku (raczej tylko dla początkujących)
__ 1. Dodanie tego co brakuje aby program się nie wyłożył tam gdzie się wykłada
__ 2. Ominięcie problemy czyli zapewnienie aby program nie poszedł tą ścieżką.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
W0
Jest jeszcze opcja usunięcia kodu, który psuje :)
_13th_Dragon
Jeżeli masz na myśli fragment kodu to podpada pod opcję 2. zaś jeżeli mowa o całości kodu i rozpocząć od nowa to racja, poprawiam. :)
W0
Tak żeby za bardzo nie brnąć w temat - IMO OP próbuje korzystać z frameworka, którego nie rozumie. Co w sumie też powinno być opcją - "jeśli korzystasz z jakiegoś ciężkiego frameworka to przeczytaj dokumentację".
_13th_Dragon
Nie zgadzam się czytanie dokumentacji, to tylko sposób na określenie którą opcję wybierzemy.
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
Sampeteq napisał(a):
ZrobieDobrze napisał(a):

@_13th_Dragon: by napisał:
którego słowa nie rozumiesz w treści wyjatku ?

Wszystkie rozumiem tylko nie wiem co robić dalej.

Jak bym zrobił próbę bez lombooka ... z wielu powodów, np ew skutecznie postawił breakointy — ZrobieDobrze 2022-11-20 20:12

GDYBY lombokowe konstruktory się wygenerowały inaczej, niż kod kliencki chce tego użyć, to taki wyjątek jest do wyobrażenia

W ogóle projekt klasy z listą / kontenerem w środku to niebanalne zagadnienie (jak na klasę 10 linii). Czy tą listę / inny kontener podawać z zewnątrz w konstruktorach i nie daj boże w setterach ?
Raczej bardzo rzadko.

Pojechałeś po bandzie z uproszczeniami w zastanowieniu się, to masz.
Po drugie już wiesz, do czego prowadzi "pisanie kodu adnotacjami"


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 3x, ostatnio: ZrobieDobrze
ZD
Nawet getera do listy jako listy bym się obawiał, ale to nie taka ciężka zbrodnia.
ZD
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

BTW widze więcej zagrożeń.

Np w JPA takie wewnętrzne List<> mogło by być wypełnione przez framework (co niekoniecznie jest miodem)

Byłbym BARDZO zdziwiony, gdyby w lekkich maperach jak JOOQ działa się z ta Listą jakaś "magia", raczej nie będzie dotknięte.
(nie znam połączenia JOOQ + Spring)


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
ZD
Jak szczypiorkom mówię "trzeba więcej kwalifijacji do zajumania kodu z netu niż do napisania go samemu", tak tu przekształcę: tzreba wiecej kwalifikacji do "programowania adnotacjami" i debugowania tego, niż do pisania z palca
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 minut
  • Postów:3614
2
Sampeteq napisał(a):

Wszystkie rozumiem tylko nie wiem co robić dalej.

Skoro rozumiesz, to powinieneś wiedzieć, co robić dalej.

  1. Błąd brzmi: org.jooq.exception.DataTypeException: No Converter found for types java.util.UUID and java.util.List
  2. Czyli trzeba zrobić tak, żeby twój kontekst JOOQ nie głupiał gdy zobaczy UUID lub List.

Pierwszy link po wpisaniu "JOOQ data type conversion": https://www.jooq.org/doc/latest/manual/sql-execution/fetching/data-type-conversion/

ZD
Jak ktoś na pałę jedzie AllArgsContructor to ma
SA
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:94
0

@ZrobieDobrze: @_13th_Dragon @wartek01
Rozwiązaniem było użycie multisetAgg:

Kopiuj
 List<Post> getAllPost() {
           return dslContext
                    .select(
                            POSTS.ID,
                            POSTS.CONTENT,
                            POSTS.CREATED_AT,
                            multisetAgg(
                                    COMMENTS.ID, 
                                    COMMENTS.CONTENT, 
                                    COMMENTS.CREATED_AT, 
                                    COMMENTS.POST_ID
                            ).as("comments").convertFrom(r -> r.into(Comment.class))
                    )
                    .from(POSTS)
                    .leftJoin(COMMENTS).on(COMMENTS.POST_ID.eq(POSTS.ID))
                    .groupBy(POSTS.ID)
                    .fetchInto(Post.class);

@Riddle: Jeśli możesz to zmień tytuł wątku, bo wcale nie chodziło o te convertery.

edytowany 1x, ostatnio: Sampeteq

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.