2013-12-13 24 views
0

如何在Hibernate中運行連接HQL查詢?我已經將值插入到一對一的關係表中。但在插入表之前,我需要檢查值是否存在不是。如果退出,我需要該記錄的ID。之後,我已插入orderdetails表。如何在hibernate中執行連接查詢?

所以,我需要運行SQL從表中獲取ID。

表:產品

Product_id 
product_name 

表:版本

version_id 
product_id 
date 

所以,我需要找到VERSION_ID如果記錄存在。我想運行SQL:select version_id from product p,version v where p.product_id=v.product_id and product_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.PRODUCT") 
public class Product{ 

    private String product_id; 
    private String product_name 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="PRODUT_ID") 
    public String getProduct_id() { 
     return product_id; 
    } 

    public void setProduct_id(String product_id) { 
     this.product_id = product_id; 
    } 

    @Column(name="PRODUCT_NAME") 
    public String getProduct_name() { 
     return product_name; 
    } 

    public void setProduct_name(String product_name) { 
     this.product_name = product_name; 
    } 


} 

版本:

@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執行上面的查詢?

+0

在您的表格中,產品可能有'一對多'版本 – nachokk

+0

首先是產品和p之間缺少qhitespace。 – Diversity

+0

我們的商業版產品不同。我們有更多的表格有版本的一對多關係表。這裏只適用於一對一 – user2848031

回答

0

在這種情況下,您的班級名稱首先是零件而不是產品。 所以你必須在查詢中使用Part。

其次我不確定是否有一個hibernate id生成器能夠生成 字符串序列,所以你必須分配一個定製的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的實例,並根據關聯的表列對其屬性進行初始化。

儘量避免使用這種類型的語句。相反,使用PreparedStatements將 參數傳遞給查詢,並使用指定參數等將它們分配給查詢。

嘗試使用符合Java和JavaBeans約定的屬性和類名稱,並且避免使用不足等等。所以它更簡單地閱讀查詢並避免令人沮喪的錯誤搜索。

+0

SQL生成器爲這兩個表生成id。因爲完全插入記錄。現在我想檢查是否存在特定項目或不存在。 – user2848031

+0

好吧,我不知道。但很高興知道。 – Diversity

+0

Assum產品和版本作爲表格。因此,查詢將從Product p版本v中選擇v.version_id,其中v.product_id = p.product_id和name ='item'。 – user2848031

0

你的映射不好。你不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 
} 

而在其他類需要product_id

@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代碼規範,例如改變product_nameproductName或只是name。 2)調用數據庫中與數據庫名稱相同的類作爲約定。

3)對於字符串我會使用like子句,而不是=如果你不想精確匹配。

相關問題