JPA QuerySyntaxException:XXX is not mapped

来源:互联网 发布:网络课程看了有用吗 编辑:程序博客网 时间:2024/06/09 16:01



1、问题


Caused by: java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException: t_group is not mapped [delete from t_group i where i.userId = ?1 and i.Id =?2]

at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364)

at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)

at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)

at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)

at com.sun.proxy.$Proxy38.createQuery(Unknown Source)

at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)

at com.sun.proxy.$Proxy38.createQuery(Unknown Source)

at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:69)

at org.springframework.data.jpa.repository.query.SimpleJpaQuery.fromQueryAnnotation(SimpleJpaQuery.java:132)

at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:114)

at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:160)

at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)

at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:280)

at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:148)

at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125)

at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41)

at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)

... 36 more

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: t_group is not mapped [delete from t_group i where i.userId = ?1 and i.Id =?2]

at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)

at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)

at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)





2、背景

使用的Spring Data JPA。  涉及两个类如下

2.1 JpaRepository接口

public interface AppGroupRepositoryextends JpaRepository<AppGroup, Long> {    

    @Modifying

    @Query("delete from t_group i where i.userId = ?1 and i.Id =?2")

    public void deleteGroup(LonguserId,Long Id) ;

。。。。。。。。。。。。。。。。。。。。



2.2  Entity类

@Entity

@Table(name = "t_group")

public class AppGroupimplements java.io.Serializable,IId{





3、解决办法


默认@query 里面的JPQL, 要使用类AppGroup 和该类的属性.   把t_group 改为 AppGroup

public interface AppGroupRepository extends JpaRepository<AppGroup, Long> {    

    @Modifying

    @Query("delete fromAppGroupi where i.userId = ?1 and i.Id =?2")

    public void deleteGroup(Long userId,Long Id) ;



如果要使用SQL,可以参照如下:

@Query(value="select  t1.role from t_um_role t1 where t1.status ='1' ",nativeQuery=true)




4.  JPQL

select name ,age from user; //原生SQL语句

select u.name,u.age from User u;  //JPQL语句

select u from User u;  //JPQL语句

JPQL语句是在EJB实体空间中面向对象,属性进行操作

JPQL必须由JPA的JPQL解析器解析为SQL才能执行,必须先获取Query对象







阅读全文
0 0