Java 在SpringDataJPA中使用JoinJPA的方式有什么不同

Java 在SpringDataJPA中使用JoinJPA的方式有什么不同,java,hibernate,jpa,spring-boot,spring-data,Java,Hibernate,Jpa,Spring Boot,Spring Data,我对spring数据jpa有意见。我不知道为什么?什么是理性 问题: 我有两张桌子: 1.访问点数据库 @Entity @Table(name = "access_point") public class AccessPointDb implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue @Column(name = "access_point_id", u

我对spring数据jpa有意见。我不知道为什么?什么是理性

问题: 我有两张桌子: 1.访问点数据库

@Entity
@Table(name = "access_point")
public class AccessPointDb  implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
@Column(name = "access_point_id", unique = true, nullable = false)
private Long accessPointId;

@Column(name = "ap_mac")
private String apMac;

@Column(name = "zone_id")
private Long zoneId;

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

@Column(name = "created_date")
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;

@Column(name = "created_by")
private Long createdBy;

@Column(name = "updated_date")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedDate;

@Column(name = "updated_by")
private Long updatedBy; 


public AccessPointDb() {
    super();
}

public Long getAccessPointId() {
    return accessPointId;
}

public void setAccessPointId(Long accessPointId) {
    this.accessPointId = accessPointId;
}

public String getApMac() {
    return apMac;
}

public void setApMac(String apMac) {
    this.apMac = apMac;
}

public Long getZoneId() {
    return zoneId;
}

public void setZoneId(Long zoneId) {
    this.zoneId = zoneId;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}



public Date getCreatedDate() {
    return createdDate;
}

public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

public Long getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(Long createdBy) {
    this.createdBy = createdBy;
}

public Date getUpdatedDate() {
    return updatedDate;
}

public void setUpdatedDate(Date updatedDate) {
    this.updatedDate = updatedDate;
}

public Long getUpdatedBy() {
    return updatedBy;
}

public void setUpdatedBy(Long updatedBy) {
    this.updatedBy = updatedBy;
}

}

2.分区B

@Entity
@Table(name = "zone")

public class ZoneDb extends BaseEntity implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
@Column(name = "zone_id", unique = true, nullable = false)
private Long zoneId;

@Column(name = "zone_name")
private String zoneName;

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

public ZoneDb() {
    super();
}

public Long getZoneId() {
    return zoneId;
}

public void setZoneId(Long zoneId) {
    this.zoneId = zoneId;
}

public String getZoneName() {
    return zoneName;
}

public void setZoneName(String zoneName) {
    this.zoneName = zoneName;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

 }
在我的代码中。我想加入上面的2个表: 我使用了以下代码:
“从AccessPointDb中选择a.accessPointId,z.zoneName作为左连接分区B作为z.zoneId=z.zoneId上的z”
; 并创建查询:
query=em.createQuery(stmt,persistentClass)

但我收到一个错误:

antlr.SemanticException: Path expected for join!

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT a  FROM com.sbd.cms.data.entities.AccessPointDb AS a LEFT JOIN ZoneDb AS z ON z.zoneId = z.zoneId  WHERE 1=1 ]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT a  FROM com.sbd.cms.data.entities.AccessPointDb AS a LEFT JOIN ZoneDb AS z ON z.zoneId = z.zoneId  WHERE 1=1 ]
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:384)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:491)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)
    at com.sbd.cms.data.repository.implement.AccessPointRepository$$EnhancerBySpringCGLIB$$a5b2c11f.search(<generated>)
    at com.sbd.cms.biz.accessPoint.AccessPointBusinessImplement.search(AccessPointBusinessImplement.java:42)
    at com.sbd.cms.web.api.controller.AccessPointController.search(AccessPointController.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:115)
    at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:59)
    at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:90)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:108)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT a  FROM com.sbd.cms.data.entities.AccessPointDb AS a LEFT JOIN ZoneDb AS z ON z.zoneId = z.zoneId  WHERE 1=1 ]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1679)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:313)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
    at com.sun.proxy.$Proxy93.createQuery(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
    at com.sun.proxy.$Proxy93.createQuery(Unknown Source)
    at com.sbd.cms.data.repository.implement.GenericRepositoryImplement.findByQuery(GenericRepositoryImplement.java:189)
    at com.sbd.cms.data.repository.implement.GenericRepositoryImplement.pagingCustom(GenericRepositoryImplement.java:64)
    at com.sbd.cms.data.repository.implement.AccessPointRepository.search(AccessPointRepository.java:56)
    at com.sbd.cms.data.repository.implement.AccessPointRepository$$FastClassBySpringCGLIB$$9bda46e0.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support
我使用查询

 SELECt a.accessPointId, z.zoneName FROM AccessPointDb AS a LEFT JOIN a.zoneDb AS z ON z.zoneId = z.zoneId

是oki

但我想知道上述方法的区别是什么

SELECT a.accessPointId, z.zoneName FROM AccessPointDb AS a LEFT JOIN ZoneDb AS z ON z.zoneId = z.zoneId"
这(上面的查询)是一个本机查询,这就是为什么它会给出错误,因为您将它与EntityManager的
createQuery
方法一起使用

em.createQuery(stmt, persistentClass);
您应该使用
createNativeQuery
来运行本机查询,而不是
createQuery

本机查询:本机查询指的是实际的sql查询(指的是实际的数据库对象)。这些查询是sql语句,可以使用数据库客户端在数据库中直接执行

查询:查询指的是JPQL/HQL查询,其语法类似于通常用于执行DML语句(CRUD操作)的SQL。
在JPA中,您可以使用entityManager.createQuery()创建查询。

JPQL连接跨越关系。第一个不是跨越关系,而是在两个独立实体之间。请参阅JPA规范和JPA的文档provider@NeilStockton谢谢你的建议。上面的查询不是navtiveQuery,因为AccessPointDb和ZoneDb是两个实体,不是表。@ngotiensy,ohh抱歉,我错过了@Table annotation,实际上
选择a.accessPointId,来自AccessPointDb的z.zoneName作为左连接ZoneDb作为z ON z.zoneId=z.zoneId“;并创建查询:query=em.createQuery(stmt,persistentClass);
此时,您的实体AccessPointDb未与ZoneDb关联,hql/JPQL使用联接处理实体及其关联的实体或值集合的元素,因为该时间ZoneDb未与AccessPointDb实体关联,因此hibernate引发异常:
org.hibernate.hql.internal.ast.QuerySyntaxcep操作:路径需要加入!
感谢您的回复。但我认为这里的区别在于jpa运行在hibernate上的spring数据,这不是jpa的标准。我将更改为使用elipse链接运行它。可能是oki。@最新jpa规范(2.1)不包括不相关实体上的ngotiensy加入然而,Hibernate 5.1.0+和EclipseLink 2.4.0+支持即席连接,所以这里是Hibernate的一个有效例外,因为JPA不支持无链接连接。
SELECT a.accessPointId, z.zoneName FROM AccessPointDb AS a LEFT JOIN ZoneDb AS z ON z.zoneId = z.zoneId"
em.createQuery(stmt, persistentClass);