Java 用于休眠ORM查询的SQL查询
我正在尝试将我的普通SQL语句转换为适当的Hibernate ORM语句。我读了很多关于它的书,但还不能完全弄明白。我希望你们中的一些人能帮助我:) 以下是我认为与此任务相关的一些课程: 仓库产品(我的实体类): 我的刀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;
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 );
}