Java 如何在hibernate中执行连接查询?
如何在Hibernate中运行join HQL查询?我已将值插入到一对一关系表中。但在插入表之前,我需要检查值是否存在。如果退出,我需要该记录的id。之后,我将插入orderdetails表 所以,我需要运行SQL从表中获取ID 表:产品Java 如何在hibernate中执行连接查询?,java,hibernate,jpa,Java,Hibernate,Jpa,如何在Hibernate中运行join HQL查询?我已将值插入到一对一关系表中。但在插入表之前,我需要检查值是否存在。如果退出,我需要该记录的id。之后,我将插入orderdetails表 所以,我需要运行SQL从表中获取ID 表:产品 Product_id product_name 表:版本 version_id product_id date 所以如果记录存在,我需要找到版本号。我想运行SQL:从产品p、版本v中选择版本id,其中p.product\u id=v.product\u i
Product_id
product_name
表:版本
version_id
product_id
date
所以如果记录存在,我需要找到版本号。我想运行SQL:从产品p、版本v中选择版本id,其中p.product\u id=v.product\u id和product\u name='stackoverflow'
我试过这样做
Query q=session.createQuery("from Product p,Version v where p.product_id=v.product_id and productname='"+item+"'");
if(query.list().size()>0){
for(Iterator it=query.iterate();it.hasNext();)
{
Version std = ( Version) it.next();
System.out.println("partid: " + std.getversion_id());
V.setversion_id(std.getversion_id());
}
但是上面的代码给出了错误
org.hibernate.QueryException: could not resolve property: product_id of: Version [from Product p,Version v where p.product_id=v.product_id and productname='stack']
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1465)
at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:315)
at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:487)
at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:611)
at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263)
at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210)
at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117)
at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113)
at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:880)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1330)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4471)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3947)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2047)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1972)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:831)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:617)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:256)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
at com.import(CompleteNotice.java:764)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
版本:
@Entity
@Table(name="DBO.VERSION")
public class Version {
private int version_id;
private int product_id;
private Product product;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="VERSION_ID")
public int getVersion_id() {
return version_id;
}
public void setVersion_id(int Version_id) {
this.version_id = version_id;
}
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="product_id")
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
请建议如何在hibernate中执行上述查询?首先,在本例中,您的类名是Part而不是Product。 因此,您还必须在查询中使用Part 其次,我不确定是否有一个hibernate id生成器能够生成 字符串序列,因此您必须分配自定义的id生成器 此外,您发布的代码没有显示Version类,它是 与产品或零件的联系 在我看来,尽管存在id问题,您的查询应该是这样的
select v.version_id
from FeatureVersion v, Part p
where v.product.product_id = p.product_id
and p.product_name='"+item+"
当您执行该查询时。Hibernate创建FeaturedVersion类型的instamce,并根据关联的表列初始化其属性
尽量避免使用此类语句。使用PreparedStatements代替传递
将参数分配给查询,并使用命名参数等将其分配给查询
尝试使用符合Java和JavaBeans约定和
表示避免下划线等。因此,读取查询更简单,并且可以避免令人沮丧的错误搜索。您的映射很糟糕。在
FeatureVersion
@Entity
@Table(name="DBO.PRODUCT")
public class Part { // why not call Product..
private String product_id;
private String product_name;
private FeatureVersion version;
@OneToOne(mappedBy="product")
public FeatureVersion getFeatureVersion(){
return featureVersion;
}
//put others getters and setter
}
在另一节课上
@Entity
@Table(name="DBO.VERSION")
public class FeatureVersion {
private int version_id;
private Product product;
//add setter and getter that i leave
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="product_id", referencedColumnName= "product_id")
public Product getProduct() {
return product;
}
}
在客户端代码中,查询字符串如下所示:
String hql = "FROM Part p fetch join p.version Where p.product_name = :myParam" // this is cause you put it lazy if you don't put anything it will be eager
session.createQuery(hql).setParameter("myParam", productName).uniqueResult() // or list
一些建议:
1) 遵循java代码约定,例如将产品名称
更改为productName
或仅更改名称
。
2) 在数据库中调用与约定同名的类
3) 对于字符串,如果不希望精确匹配,我将使用
like
子句而不是=来表示 在您的表格中,一个产品可以有一对多
版本。首先,产品和p之间缺少QHIT空间。我们的业务版本产品不同。我们还有几个表可以为版本设置一对多关系表。此处仅应用一对一引发了什么类型的错误?无法解析属性:product\u id of:version[来自产品p,版本v,其中p.product\u id=v.product\u id和productname='stack']SQL Generator为这两个表生成id。因为插入记录非常完美。现在我想检查特定项目是否存在,或者是否仅存在。将产品和版本作为表。所以查询将是从产品p中选择v.version\u id,其中v.Product\u id=p.Product\u id和name='item'。如果我错了,请纠正我。因为我再次得到了相同的错误。HQL查询与SQL的不同之处在于它直接与实体类的对象关联。Hibernate自行解析到数据库中的表和列的映射,因此在查询中必须使用类名和适当的属性名。在本例中,使用引用名称product后跟一个点和该类的相应proeprity来解析引用或关系
String hql = "FROM Part p fetch join p.version Where p.product_name = :myParam" // this is cause you put it lazy if you don't put anything it will be eager
session.createQuery(hql).setParameter("myParam", productName).uniqueResult() // or list