`

初学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条。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics