2014-02-16 183 views
0

我想將我的普通SQL語句轉換成適當的Hibernate ORM的。我已經閱讀了很多關於它的內容,但還沒有完全弄清楚。我希望你們中的一些可以幫助我:)SQL查詢到休眠ORM查詢

下面是一些我的課,我認爲有關這項任務的:

WarehouseProduct(我的實體類):

package exercise.java.basics.storage; 

public class WarehouseProduct { 

private int productID; 
private String productName; 
private int productCount; 

public WarehouseProduct(final String productName, final int productCount) { 

    this.productName = productName; 
    this.productCount = productCount; 
} 

public WarehouseProduct() { 

} 

public int getProductID() { 
    return this.productID; 
} 

public void setProductID(final int productID) { 
    this.productID = productID; 
} 

public String getProductName() { 
    return this.productName; 
} 

public void setProductName(final String productName) { 
    this.productName = productName; 
} 

public int getProductCount() { 
    return this.productCount; 
} 

public void setProductCount(final int productCount) { 
    this.productCount = productCount; 
} 

} 

吾道。

package exercise.java.basics.storage; 


import javax.transaction.Transactional; 

import exercise.java.basics.storage.ProductEnum.Product; 


@Transactional 
public interface WarehouseDAO { 

public void initializeWarehouse(); 

public void storeProducts(final Product product, final int count); 

public void removeProducts(final Product product, final int count); 

public void updateStock(); 

} 

storeProduct()從我的DAO實現方法:

public void storeProducts(final Product product, final int count) { 

    //Plain-SQL, works just fine 
    Session session = getSessionFactory().getCurrentSession(); 

    SQLQuery storeProductQuery = session.createSQLQuery("UPDATE WAREHOUSE SET product_count = " + count //$NON-NLS-1$ 
      + " WHERE product_name = '" + product + "';"); //$NON-NLS-1$ //$NON-NLS-2$ 

    storeProductQuery.executeUpdate(); 



    //Hibernate attempt, doesn't work just yet 
    session.get("WarehouseProduct.class", "product_count"); //$NON-NLS-1$ //$NON-NLS-2$ 

    Criteria createCriteria = session.createCriteria(WarehouseProduct.class); // Object.class = Entity 

    createCriteria.add(Property.forName("product_name").like(product)); 

    createCriteria.list(); 

}  

當測試我不同時使用(普通的SQL /休眠)嘗試一次的課程。

我認爲我已經有一半了,但仍然無法弄清楚完整的hibernate方法,這就是我希望你能幫助我的地方。

基本上我需要的是將storeProduct()方法中的純sql字符串轉換爲正確的hibernate命令。

將不勝感激任何幫助,你可以給我。

問候 daZza

編輯:這裏的映射:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 
<class name="exercise.java.basics.storage.WarehouseProduct" table="WAREHOUSE"> 
    <id name="productID" type="integer"> 
     <column name="product_ID" not-null="true"/> 
     <generator class="identity" /> 
    </id> 
    <property name="productName" type="string"> 
     <column name="product_name" length="100"/> 
    </property> 
    <property name="productCount" type="integer"> 
     <column name="product_count"/> 
    </property> 
</class> 
</hibernate-mapping> 

至於這個問題,它是在不完整的代碼恕我直言。我很確定我的hibernate命令仍然缺少某些東西,或者只是錯誤的。

這是我想轉換爲hibernate的源SQL字符串:「UPDATE WAREHOUSE SET product_count =」+ count +「WHERE product_name ='」+ product +「';」

+0

你能分享你的Hibernate實體映射,在XML可能,因爲我看到在你的實體類中沒有JPA/Hibernate註解。 還有你現在的錯誤/問題。 –

+0

將我的映射文件添加到原始帖子。 – daZza

回答

0

我讀了更多的例子和文檔,並提出了以下內容,我認爲這是現在的工作。至少沒有錯誤消息,並且休眠記錄器消息看起來不錯。

不幸的是,我不能檢查數據庫內的數據是否正確,因爲我沒有弄清楚如何將hibernate查詢結果(對象)轉換爲可讀的東西,如字符串。

我還將hibernate映射文件中的主鍵更改爲productName而不是自動遞增的值。背後的原因主要是休眠get()函數,因爲它似乎需要PK als第二個屬性。自動生成的密鑰是隨機的,所以我可能會需要在更新之前進行另一次選擇,以確定相應產品的行的PK。因爲我不知道如何轉換不會工作的休眠選擇查詢的結果。

因此,這裏是我的新類:

public void storeProducts(final Product product, final int count) { 

    Session session = getSessionFactory().getCurrentSession(); 

    WarehouseProduct productToStore = (WarehouseProduct) session.get( WarehouseProduct.class, 
      String.valueOf(product)); 
    productToStore.setProductCount(productToStore.getProductCount() + count); 
    session.update(productToStore); 

} 
2

您可以使用限制類來獲得您的結果。使用以下命令:

createCriteria.add(Restrictions.like("productName", product.getProductName())); 

請注意,我在你的產品對象的database.Your方式使用的字段名稱,而不是列名也可以通過改變

createCriteria.add(Property.forName("product_name").like(product)); 

工作

createCriteria.add(Property.forName("product_name").like(product.getProductName())); 

我注意到你是匹配「product_name」與「產品」這是整個對象,而不是你匹配的字段。

+0

謝謝。我也可以使用這個限制類來更新表格嗎?對於我來說,這是最令人困惑的事情...有沒有選擇/更新/刪除/ ...函數被發現:D – daZza

+0

對於更新,我會建議使用'session.createQuery'爲HQL查詢或'session.createSQLQuery '用於原生SQL。您可以使用分號將參數添加到查詢中,例如。 'where product_name =:productName'(用於原生SQL)。然後,您可以使用'query.setParameter(「procuctName」,product.getProductName())'或使用特定的數據類型(如query.setLong(...)'' 請參閱[Native SQL](https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html)和[HQL](https://docs.jboss.org/hibernate/orm/3.3/ reference/en/html/queryhql.html)查詢。 – user3315806