初学jpa遇到的有关问题_小记
初学jpa遇到的问题_小记
初学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条。