LINQ-style queries for Java 8

Related tags

Database Jinq
Overview

JINQ: Easy Database Queries for Java 8

Jinq provides developers an easy and natural way to write database queries in Java. You can treat database data like normal Java objects stored in collections. You can iterate over them and filter them using normal Java commands, and all your code will be automatically translated into optimized database queries. Finally, LINQ-style queries are available for Java!

Jinq can also be used within Scala to provide database queries similar to Typesafe's Slick but using JPA ORMs like Hibernate.

Documentation about how to get started with Jinq and other information can be found on the Jinq project page

Comments
  • "Unknown method" when using eclipselink-static-weave with Lazy-Loading

    I use the eclipselink-static-weave-plugin during compile time for my entities. For relations between classes I use the annotations OneToOne,OneToMany and ManyToOne. If I use eager loading, everything will work as expected and queries execute normally. Using FetchType.LAZY on OneToMany queries also works as expected. But using lazy loading together with OneToOne or ManyToOne relational annotations, then using the field's getter-methods inside queries, I get the following exception: org.jinq.rebased.org.objectweb.asm.tree.analysis.AnalyzerException: Unknown method Sale:getCustomer()LCustomer; encountered.

    These are my entities:

    @Entity
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Customer {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
        private String name;
        @OneToMany(fetch = FetchType.LAZY)
        @JoinColumn(name="CUSTOMER_ID")
        private List<Sale> sales;
    }
    
    @Entity
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class Sale {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
        private String name;
        @ManyToOne(fetch = FetchType.LAZY)
        private Customer customer;
    }
    

    The following code (joining OneToMany) works as expected:

    streams.streamAll(em, Customer.class)
            .join(c -> JinqStream.from(c.getSales()))
            .forEach(System.out::println);
    

    The following one, working with ManyToOne, produces the issue:

    streams.streamAll(em, Sale.class)
            .joinFetch(s -> JinqStream.of(s.getCustomer()))
            .forEach(System.out::println);
    

    It results in

    java.lang.reflect.InvocationTargetException
    Caused by: java.lang.IllegalArgumentException: Could not analyze lambda code
    Caused by: org.jinq.rebased.org.objectweb.asm.tree.analysis.AnalyzerException: Unknown method Sale:getCustomer()LCustomer; encountered
    

    Interestingly, in the decompiled class files, the method getCustomer does exist:

    public Customer getCustomer() {
        return this._persistence_get_customer();
    }
    
    opened by oberien 23
  • Create and use Pojos in queries

    Create and use Pojos in queries

    Currently one has to use Pair or Tuple2,3,... to compine multiple values. Would it be possible to support creating and using (immutable) POJOs?

    This would be extremely helpful for One-To-One mapped joins, as no Collector is needed to be written. It would also simplify reading huge queries, as foo.bar().baz().qux is easier to read and keep in mind than pair.getOne().getOne().qux.

    opened by oberien 13
  • Sub query support

    Sub query support

    What needs to be done to support sub-queries like below so we don't get duplicate person records? JPQL seems to support this query format. Doing a JINQ's join and distinct seems to throw up errors when combined with paging and sorting.

    SELECT * FROM Person
    WHERE ID IN (SELECT ToId FROM Friends WHERE FromId = :personId )
    
    opened by abibell 12
  • leftOuterJoin JoinWithSource support

    leftOuterJoin JoinWithSource support

    Hi! Possible to create leftOuterJoin with JoinWithSource implementation? I have 3 table. I18NMaster <-> I18N <-> Language

    I want to select all I18NMaster field in all Language, and where exists, I want the I18N localized text...

    b0c1

    opened by b0c1 12
  • Make the project available in Maven Central

    Make the project available in Maven Central

    It is pre-requisite for any modern project. The best would be to just restructure it for Maven. There is also EntityGenerator that will need a Maven plugin so the consumers can integrate it into their projects easily.

    I can help with all that but the transition will require moving a lot of files and could not be done in parallel with a significant amount of other work... But anyway it is best for the project to do it early.

    Also there is a question about the package names, the project now is under jinq.org umbrella but there are a lot of stuff in ch.* packages. It there is no good reason to keep them there it would be good to also change packaging so it is associated with the project, i.e. org.jing.*

    enhancement 
    opened by igorzep 12
  • Join two JinqStreams

    Join two JinqStreams

    I have two queries, which are both working and translatable into sql. The elements streamed in these queries are different and not connected. If I have two pre-filtered JPAJinqStreams and want to join them on one property, Jinq tells me, it is not possible, even though in SQL it is one of the easiest things to do.

    Enough on these abstract stuff, let's get to an example: I have two classes Class1 and Class2, both of which can be tagged with class Tag. I don't want List<Tag> to be a delegate of all classes being able to be tagged (in this example Class1 and Class2). To get all valid Tag-Class1-Pairs, this query works perfectly as expected:

    streams.streamAll(em, Class1.class)
        .join((c, source) -> source.stream(Tag.class))
        .where(p -> p.getOne().getId() == p.getTwo().getTaggedId())
        .forEach(System.out::println);
    

    Producing:

    SELECT A, B FROM Class1 A, Tag B WHERE A.id = B.taggedId
    

    Now I'd like to pre-filter both streams (e.g. permission-wise) and get them separately by calling Service-Functions:

    JPAJinqStream<Class1> classStream = service.getFilteredClassStream();
    JPAJinqStream<Tag> tagStream = service.getFilteredTagStream();
    
    classStream.join(c -> tagStream)
        .where(p -> p.getOne().getId() == p.getTwo().getTaggedId())
        .forEach(System.out::println);
    

    This for whatever reason results in java.lang.reflect.InvocationTargetException Caused by: java.lang.IllegalArgumentException: Could not extract code from lambda. This error sometimes occurs because your lambda references objects that aren't Serializable.

    But actually there is no major difference semantic-wise. In the first example, I create the new stream from inside the stream. In the second example I use one from outside. In the first example source.stream produces JinqStream<U>, which is the same as getFilteredTagStream() returning JPAJinqStream<Tag> extends JinqStream<Tag>.

    So my question is: How do I join two different streams, produced in different contexts?

    enhancement 
    opened by oberien 11
  • A Stream that returns a list of UUIDs is not serializable

    A Stream that returns a list of UUIDs is not serializable

    I have 2 entities:

    ProxyEntity: Id(UUID), IssueDate, IssueNumber, RegistrationNumberId, WriterId among others.
    ClientPerProxyEntity: ProxyId, ClientID, Both UUID
    

    Now when I apply the following code:

    var proxies = clientPerProxyRepository.createStream().where(item -> item.getClientId().equals(id))
    							.select(ClientPerProxyEntity::getProxyId);
    proxyStream.where(proxy->JPQL.isIn(proxy.getId(),proxies)
    

    It says

    java.lang.IllegalArgumentException: Could not extract code from lambda. This error sometimes occurs because your lambda references objects that aren't Serializable
    

    But when I apply the following code:

    var tmp = proxyStream1.join((c, source) -> source.stream(ProxyEntity.class))
    							.where(pair -> pair.getOne().getIssueDate().equals(pair.getTwo().getIssueDate())
    									&& pair.getOne().getIssueNumber().equals(pair.getTwo().getIssueNumber())
    									&& pair.getOne().getRegistrationNumberId()
    											.equals(pair.getTwo().getRegistrationNumberId())
    									&& pair.getOne().getWriterId().equals(pair.getTwo().getWriterId())
    									&& !pair.getOne().getId().equals(pair.getTwo().getId()))
    							.select(Pair::getOne).select(ProxyEntity::getId);
    proxyStream.where(item->JPQL.isIn(item.getId(),tmp);
    

    It works perfectly?

    opened by OssNass 10
  • Add support for java.time package

    Add support for java.time package

    I'm using Jinq to implement a complex filter in a Spring Boot application and most of it is doing fine. However my entities are all mapped using java.time package when it comes do Date and Time fields. I kindly request that you enhance JinQ to support methods like isAfter and isBefore (and maybe even Period.isBetween) just like it does today but for the following main objects used for mapping: java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime

    Thx.

    enhancement 
    opened by jeffjedi 8
  • java.lang.IllegalArgumentException: Could not translate code to a query

    java.lang.IllegalArgumentException: Could not translate code to a query

    I want to query like: SELECT b.* FROM (SELECT id as id, max(version) as version FROM gmcc.st.cms.model.content.forum.Posting GROUP BY id) AS a LEFT JOIN gmcc.st.cms.model.content.forum.Posting AS b ON a.id = b.id AND a.version = b.version

    so tried the following: List _items = stream(Posting.class) .group(i -> i.getVersion(), (key, stream) -> stream.max(i -> i.getVersion())) .leftOuterJoin((i, session) -> session.stream(Posting.class), (i, posting) -> i.getOne().equals(posting.getId()) && i.getTwo().equals(posting.getVersion())) .select(i -> i.getTwo()) .toList();

    getting the following error with sortedDescendingBy: java.lang.IllegalArgumentException: Could not translate code to a query at org.jinq.hibernate.HibernateQueryComposer.translationFail(HibernateQueryComposer.java:123) ~[jinq-hibernate-legacy-1.8.29.jar:?] at org.jinq.hibernate.HibernateQueryComposer.applyTransformWithTwoLambdas(HibernateQueryComposer.java:341) ~[jinq-hibernate-legacy-1.8.29.jar:?] at org.jinq.hibernate.HibernateQueryComposer.leftOuterJoinWithSource(HibernateQueryComposer.java:589) ~[jinq-hibernate-legacy-1.8.29.jar:?] at org.jinq.orm.stream.QueryJinqStream.leftOuterJoin(QueryJinqStream.java:142) ~[api-1.8.29.jar:?] at org.jinq.hibernate.QueryJPAJinqStream.leftOuterJoin(QueryJPAJinqStream.java:199) ~[jinq-hibernate-legacy-1.8.29.jar:?] at org.jinq.hibernate.QueryJPAJinqStream.leftOuterJoin(QueryJPAJinqStream.java:16) ~[jinq-hibernate-legacy-1.8.29.jar:?] at gmcc.st.cms.repository.PostingRepository.query(PostingRepository.java:182) ~[classes/:?] at gmcc.st.cms.repository.PostingRepository$$FastClassBySpringCGLIB$$f5549cb2.invoke() ~[classes/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at gmcc.st.cms.repository.PostingRepository$$EnhancerBySpringCGLIB$$bdca9b99.query() ~[classes/:?] at gmcc.st.cms.repository.PostingRepository$$FastClassBySpringCGLIB$$f5549cb2.invoke() ~[classes/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at gmcc.st.cms.repository.PostingRepository$$EnhancerBySpringCGLIB$$59baa243.query() ~[classes/:?] at gmcc.st.cms.controller.PostingController.query(PostingController.java:56) ~[classes/:?] at gmcc.st.cms.controller.PostingController$$FastClassBySpringCGLIB$$5d84fcd6.invoke() ~[classes/:?] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at gmcc.st.sparrow.log.AutoLogAspect.log(AutoLogAspect.java:93) [classes/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_191] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_191] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) [spring-aop-4.3.16.RELEASE.jar:4.3.16.RELEASE] at gmcc.st.cms.controller.PostingController$$EnhancerBySpringCGLIB$$2fd264bc.query() [classes/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_191] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_191] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) [spring-web-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) [spring-web-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) [servlet-api.jar:?] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.16.RELEASE.jar:4.3.16.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:?] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.24] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.24] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) [shiro-core-1.4.0.jar:1.4.0] at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) [shiro-core-1.4.0.jar:1.4.0] at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) [shiro-core-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) [shiro-web-1.4.0.jar:1.4.0] at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) [shiro-web-1.4.0.jar:1.4.0] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347) [spring-web-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263) [spring-web-4.3.16.RELEASE.jar:4.3.16.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.24] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.24] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.24] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.24] at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.11.1.jar:2.11.1] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.24] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.24] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [catalina.jar:8.5.24] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.24] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) [catalina.jar:8.5.24] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.24] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.24] at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:8.5.24] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.24] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.24] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-coyote.jar:8.5.24] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.24] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-coyote.jar:8.5.24] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-coyote.jar:8.5.24] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.24] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_191] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_191] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.24] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191] Caused by: org.jinq.jpa.transform.QueryTransformException: Existing query cannot be transformed further at org.jinq.jpa.transform.OuterJoinOnTransform.apply(OuterJoinOnTransform.java:98) ~[jinq-jpa-1.8.29.jar:?] at org.jinq.hibernate.HibernateQueryComposer.applyTransformWithTwoLambdas(HibernateQueryComposer.java:337) ~[jinq-hibernate-legacy-1.8.29.jar:?] ... 102 more

    opened by phdbutbachelor 7
  • How to do (jinq and JPA, and spring) supporting transaction configuration

    How to do (jinq and JPA, and spring) supporting transaction configuration

    The inside of the Java or more and spring binding, relevant information display configuration?

    Added, in fact, the inside of the scala slick is good enough, but Java jinq gave us the same.

    opened by mysoko 7
  •  Could not translate code to a query

    Could not translate code to a query

    code: var rsp=repository.stream().where(c->c.getFlowIcon().equals("")).toList();

    StackOverflow: java.lang.IllegalArgumentException: Could not translate code to a query at org.jinq.jpa.JPAQueryComposer.translationFail(JPAQueryComposer.java:113) at org.jinq.jpa.JPAQueryComposer.applyTransformWithLambda(JPAQueryComposer.java:300) at org.jinq.jpa.JPAQueryComposer.where(JPAQueryComposer.java:449) at org.jinq.jpa.JPAQueryComposer.where(JPAQueryComposer.java:63) at org.jinq.orm.stream.QueryJinqStream.where(QueryJinqStream.java:45) at org.jinq.jpa.QueryJPAJinqStream.where(QueryJPAJinqStream.java:106) at com.laiye.entfs.biz.controller.DebugController.test(DebugController.java:25) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1070) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:97) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:41002) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:831

    opened by friddle 6
  • Anonymous class as a custom tuple

    Anonymous class as a custom tuple

    It would be great to have this feature

    List<Account> bobsAccounts = customerStream
       .where( c -> c.getFirstName().equals("Bob") )
       .join( c -> new Object() { Customer customer = c; Account account = c.getAccount(); } )
       .select( t -> t.account )
       .toList();
    

    Type inference with var is only allowed for local variables (they could allow that for fields in anonymous classes which are fully local but they didn't...) so you will need to explicitly specify the field types. But it still could be useful making the code more readable than with getOne()/getTwo(). And it would allow you to avoid creating separate custom tuple classes.

    enhancement 
    opened by artelk 5
  • Add REGEXP support

    Add REGEXP support

    I'm trying to add the REGEXP function into jinq. It's a function from SQLite, has a similar syntax to LIKE.

    It should generate: SELECT name FROM MyTable WHERE name REGEXP '^.....$'

    I tried to add REGEXP to custom sql functions, this generated: "SELECT A FROM MyTable A WHERE function('REGEXP', A.name, :param0)"

    Which is not recognized and gives following error: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: function (REGEXP)

    I'm assuming that custom sql function may not be correct. Is it possible to add a new AST node for REGEXP function without having to edit the jinq source code?

    opened by IceBlizz6 7
  • Kotlin support

    Kotlin support

    Hello I would like to advocate for Kotlin support.

    I found this thread on stack overflow https://stackoverflow.com/questions/40064479/jinq-in-kotlin-how-to-convert-lambda-into-java-serializedlambda

    I encountered the same problem. "This error sometimes occurs because your lambda references objects that aren't Serializable."

    Would you still consider adding Kotlin support in the near future? If needed i can provide a sample project.

    enhancement 
    opened by IceBlizz6 6
  • Support for compareTo for AttributeConverter types

    Support for compareTo for AttributeConverter types

    It would be great to be able to have support also for compareTo method (translated to SQL probably to </> operators - they work for most types in DB engines) for datatypes using AttributeConverter and registered by registerAttributeConverterType. As I see in the docs (and from stacktrace :D) currently only equals is supported.

    I think it can be assumed that simple comparison operators can be used and it would be great for using rich domain objects (written around single DB column) directly in entities and then in JINQ queries.

    opened by mkp05 1
  • bug on where(p->p.isReadOnly()==true) Could not analyze lambda code

    bug on where(p->p.isReadOnly()==true) Could not analyze lambda code

    JPAJinqStream query = this.streamAll(DictionaryCategory.class); List list = query.where(p.isDeleted() == true).toList(); failure[Could not analyze lambda code] use the isReadOnly also occur the same error @my2iu jdk:1.8.0_181 springboot:2.1.0.RELEASE

    image

    image image image

    opened by kindywu 7
Owner
Ming Iu
Ming Iu
jdbi is designed to provide convenient tabular data access in Java; including templated SQL, parameterized and strongly typed queries, and Streams integration

The Jdbi library provides convenient, idiomatic access to relational databases in Java. Jdbi is built on top of JDBC. If your database has a JDBC driv

null 1.7k Dec 27, 2022
H2 is an embeddable RDBMS written in Java.

Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; disk-based or in-memory

H2 Database Engine 3.6k Jan 5, 2023
A blazingly small and sane redis java client

Jedis Jedis is a blazingly small and sane Redis java client. Jedis was conceived to be EASY to use. Jedis is fully compatible with redis 2.8.x, 3.x.x

Redis 10.8k Dec 31, 2022
Elasticsearch Java Rest Client.

JEST Jest is a Java HTTP Rest client for ElasticSearch. ElasticSearch is an Open Source (Apache 2), Distributed, RESTful, Search Engine built on top o

Searchly 2.1k Jan 1, 2023
Java binding for etcd

jetcd: Java binding for etcd TravisCI: CircleCI: A simple Java client library for the awesome etcd Uses the Apache HttpAsyncClient to implement watche

Justin Santa Barbara 134 Jan 26, 2022
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Dec 30, 2022
MariaDB Embedded in Java JAR

What? MariaDB4j is a Java (!) "launcher" for MariaDB (the "backward compatible, drop-in replacement of the MySQL(R) Database Server", see FAQ and Wiki

Michael Vorburger ⛑️ 720 Jan 4, 2023
requery - modern SQL based query & persistence for Java / Kotlin / Android

A light but powerful object mapping and SQL generator for Java/Kotlin/Android with RxJava and Java 8 support. Easily map to or create databases, perfo

requery 3.1k Jan 5, 2023
Speedment is a Stream ORM Java Toolkit and Runtime

Java Stream ORM Speedment is an open source Java Stream ORM toolkit and runtime. The toolkit analyzes the metadata of an existing SQL database and aut

Speedment 2k Dec 21, 2022
A blazingly small and sane redis java client

Jedis Jedis is a blazingly small and sane Redis java client. Jedis was conceived to be EASY to use. Jedis is fully compatible with redis 2.8.x, 3.x.x

Redis 10.9k Jan 8, 2023
jOOQ is the best way to write SQL in Java

jOOQ's reason for being - compared to JPA Java and SQL have come a long way. SQL is an "ancient", yet established and well-understood technology. Java

jOOQ Object Oriented Querying 5.3k Jan 4, 2023
MapDB provides concurrent Maps, Sets and Queues backed by disk storage or off-heap-memory. It is a fast and easy to use embedded Java database engine.

MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be u

Jan Kotek 4.6k Jan 1, 2023
Event capture and querying framework for Java

Eventsourcing for Java Enabling plurality and evolution of domain models Instead of mutating data in a database, Eventsourcing stores all changes (eve

Eventsourcing, Inc. 408 Nov 5, 2022
Java code generator for calling PL/SQL.

OBridge OBridge provides a simple Java source code generator for calling Oracle PL/SQL package procedures. Supported input, output parameters and retu

Ferenc Karsany 21 Oct 7, 2022
A zero ceremony ORM for Java

Release notes Welcome Persism is a wood simple, auto discovery, auto configuration, and convention over configuration ORM (Object Relational Mapping)

Dan Howard 121 Dec 17, 2022
A lightweight and performant Java ORM alternative.

LightORM A lightweight and performant Java ORM alternative. LightORM has annotation processors so that all the integration code with the database is g

Jailson Pereira 14 Nov 22, 2022
Java implementation of Condensation - a zero-trust distributed database that ensures data ownership and data security

Java implementation of Condensation About Condensation enables to build modern applications while ensuring data ownership and security. It's a one sto

CondensationDB 43 Oct 19, 2022