Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于休眠ORM查询的SQL查询_Java_Sql_Hibernate_Orm - Fatal编程技术网

Java 用于休眠ORM查询的SQL查询

Java 用于休眠ORM查询的SQL查询,java,sql,hibernate,orm,Java,Sql,Hibernate,Orm,我正在尝试将我的普通SQL语句转换为适当的Hibernate ORM语句。我读了很多关于它的书,但还不能完全弄明白。我希望你们中的一些人能帮助我:) 以下是我认为与此任务相关的一些课程: 仓库产品(我的实体类): 我的刀 package exercise.java.basics.storage; import javax.transaction.Transactional; import exercise.java.basics.storage.ProductEnum.Product;

我正在尝试将我的普通SQL语句转换为适当的Hibernate ORM语句。我读了很多关于它的书,但还不能完全弄明白。我希望你们中的一些人能帮助我:)

以下是我认为与此任务相关的一些课程:

仓库产品(我的实体类):

我的刀

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

}
my 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)尝试

我想我已经走了一半了,但仍然无法找到完整的hibernate方法,这就是我希望你能帮助我的地方

基本上,我只需要将storeProduct()方法中的普通sql字符串转换为正确的hibernate命令

如果您能给我任何帮助,我将不胜感激

致意 达扎

编辑:以下是映射:

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

至于问题,它在不完整的代码imho中。我很确定我的hibernate命令仍然缺少一些东西和/或完全错误


这是我想转换为hibernate的源SQL字符串:“UPDATE WAREHOUSE SET product_count=“+count+”其中product_name=”“+product+”;”

您可以使用Restrictions类来获得结果。使用以下命令:

createCriteria.add(Restrictions.like("productName", product.getProductName()));
请注意,我在产品对象中使用了字段名,而不是数据库中的列名

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


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

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

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

我还将hibernate映射文件中的主键更改为productName,而不是自动递增的值。这背后的原因主要是hibernates get()函数,因为它似乎需要第二个属性。自动生成的密钥有点随机,所以我可能需要在更新之前进行另一次选择,以识别具有相应产品的行的PK。因为我不知道如何转换一个hibernate select查询的结果,而这个查询是不起作用的

这是我的新课:

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

} 

您能用xml共享您的Hibernate实体映射吗,因为我在您的实体类中没有看到JPA/Hibernate注释。还有您现在遇到的错误/问题。将我的映射文件添加到原始帖子中。谢谢。我还可以使用这个限制类来更新表?这是关于hibernate最让我困惑的事情。。。没有选择/更新/删除/。。。要找到的函数:对于更新,我建议对HQL查询使用
session.createQuery
,对原生SQL使用
session.createSQLQuery
。您可以使用分号向查询中添加参数,例如,
其中product_name=:productName
(对于本机SQL)。然后,您可以使用
query.setParameter(“procctName”,product.getProductName())
或使用特定的数据类型,例如
query.setLong(…)
查看文档以了解和查询。
createCriteria.add( Property.forName( "product_name" ).like( product.getProductName() ) );
 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 );

}