初学jpa遇到的各种“坑”
1、在写Repository类的时候,写自定义的@Query语句的时候,报错如下:
注意:
-
select from后跟的不是表名,是Entity对象名。
-
如果为Entitiy对象设置了name为“NetPool”,则Entitty对象名就是name后的名字;如果没有设置name,默认使用public class后的“NetPoolE”类名。
- where后的对象别名 . 属性名,这里的属性名不是@Cloumn(name="")的name的名字。而是当前Entity对象的property,也就是private Integer vlanNO中的vlanNO。
故此会报错。
如例子所示:
@Entity(name = "NetPool")
public class NetPoolE {
/**
* 主键 网络池Id
* (底层cloudVM中网络池Id)
*/
@Id
@Column(name="netPoolId")
private String netPoolId;
/* @Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid")
@Column(name = "netPoolId")
private String netPoolId;*/
/**
* 网络名称
*/
@Column(name = "netName", length = 255)
private String netName;
/**
* vlan号
*/
@Column(name = "vlanNo")
private Integer vlanNO;
/**
* 网关
*/
@Column(name = "gateway", length = 255)
private String gateway;
/**
* 子网
*/
@Column(name = "subNet", length = 255)
private String subNet;
/**
* dns
*/
@Column(name = "dns", length = 255)
private String dns;
/**
* 同步时间
*/
private Date synDate;
/**
* 是否可用
*/
private Boolean isAvl;
/**
* 组织Id
*/
private String orgId;
/**
* 连接信息
*/
@Column(length = 500)
private String configId;
/***此处省略很多setget器*****/
}
public interface NetPoolRepository extends JpaRepository<NetPoolE, String> {
/**
* 输入字符,模糊匹配 vlanNo或网关或子网或dns的值,分页显示所有虚拟网络
*
* @param vlanNo
* vlan号
* @param gateway
* 网关
* @param subnet
* 子网
* @param dns
* dns
* @param pageable
* 分页信息
* @return Page<NetPoolE>
* 虚拟网络分页列表
*/
@Query("SELECT np FROM NetPoolE np where np.vlanNo=?1 or np.gateway=?2 or np.subNet=?3 or np.dns=?4")
List<NetPoolE> queryVlanNoORgatewayORsubNetORdns(Integer vlanNo, String gateway, String subnet, String dns);
}
在spring boot 启动的时候报错:
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: NetPoolE is not mapped [SELECT np FROM NetPoolE np where np.vlanNo=?1 or np.gateway=?2 or np.subNet=?3 or np.dns=?4]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:331) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_60]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_60]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_60]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344) ~[spring-orm-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at com.sun.proxy.$Proxy77.createQuery(Unknown Source) ~[na:na]
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:86) ~[spring-data-jpa-1.9.2.RELEASE.jar:na]
... 68 common frames omitted
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: NetPoolE is not mapped [SELECT np FROM NetPoolE np where np.vlanNo=?1 or np.gateway=?2 or np.subNet=?3 or np.dns=?4]
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
... 75 common frames omitted
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: NetPoolE is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:338) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3678) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3567) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:708) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:564) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
... 83 common frames omitted
如果把select语句中的NetPoolE改为NetPool后,仍然提示报错:
org.hibernate.QueryException: could not resolve property: vlanNo of: com.sugon.cloudview.cloudmanager.resource.serviceImpl.dao.entity.vnet.NetPoolE
这个原因是因为vlanNo在NetPool的Entity对象中找不到,也就是说最上面注意中的第3条。