【问题标题】:SQL Query to Hibernate ORM QuerySQL 查询到休眠 ORM 查询
【发布时间】:2014-02-16 09:59:43
【问题描述】:

我正在尝试将我的普通 SQL 语句转换为适当的 Hibernate 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;
}

}

我的 DAO。

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();

}

我的 DAO 实现中的 storeProduct() 方法:

   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 字符串转换为正确的休眠命令。

非常感谢您能给我的任何帮助。

最好的问候 咻咻咻

编辑:这是映射:

<?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>

至于问题,它在不完整的代码中恕我直言。我很确定我的休眠命令仍然缺少某些内容和/或完全是错误的。

这是我要翻译成休眠的源 SQL 字符串:“UPDATE WAREHOUSE SET product_count =” + count + “ WHERE product_name = '” + product + “';”

【问题讨论】:

  • 您能否分享您的 Hibernate Entity 映射,可能是在 xml 中,因为我在您的 Entity 类中没有看到 JPA/Hibernate Annotations。还有你现在遇到的错误/问题。
  • 将我的映射文件添加到原始帖子中。

标签: java sql hibernate orm


【解决方案1】:

您可以使用 Restrictions 类来获取结果。使用以下内容:

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

请注意,我在您的 Product 对象中使用了字段名称,而不是数据库中的列名称。您的方式也可以通过更改来工作

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

到

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

我注意到您正在将“product_name”与“product”匹配,后者是整个对象,而不是您要匹配的字段。

【讨论】:

  • 谢谢。我也可以使用这个限制类来更新表吗?这是关于休眠对我来说最令人困惑的事情......没有找到选择/更新/删除/...功能:D
  • 对于更新,我建议使用 session.createQuery 进行 HQL 查询或使用 session.createSQLQuery 进行本机 SQL。您可以使用分号向查询中添加参数,例如。 where product_name = :productName(用于本机 SQL)。然后,您可以使用 query.setParameter("procuctName", product.getProductName()) 或使用特定数据类型(例如 query.setLong(...))设置参数的值,请参阅Native SQL 和 HQL 查询的文档。
【解决方案2】:

我阅读了更多示例和文档,并提出了以下内容,我认为这些内容现在正在发挥作用。至少没有错误消息,并且休眠记录器消息看起来不错。

不幸的是,我无法检查数据库中的数据是否正确,因为我不知道如何将休眠查询结果(对象)转换为字符串等可读内容。

我还将休眠映射文件中的主键更改为 productName 而不是自动递增的值。其背后的原因主要是休眠 get() 函数,因为它似乎需要 PK 作为第二个属性。自动生成的密钥有点随机,所以我可能需要在更新之前进行另一个选择,以识别具有相应产品的行的 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 );

} 

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2012-01-26
    相关资源
    最近更新 更多