2014-02-16 5 views
0

Я пытаюсь преобразовать мои простые инструкции SQL в соответствующие Hibernate ORM. Я много читал об этом, но до сих пор не могу понять это полностью. Я надеюсь, что некоторые из вас может помочь мне :)SQL Query to Hibernate ORM Query

Вот некоторые из моих классов, которые я думаю, что отношение к этой задаче:

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

} 

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/спящий режим) пытается сразу конечно.

Я думаю, что я уже нахожусь на полпути, но все еще не мог понять полный спящий подход, и именно там я надеюсь, что вы можете мне помочь.

В основном все, что мне нужно, это преобразование простой строки sql в методе storeProduct() для правильных команд hibernate.

Буду признателен за любую помощь, которую вы можете мне дать.

наилучшими пожеланиями daZza

EDIT: Вот отображение:

<?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. Я почти уверен, что мои команды спящего режима все еще отсутствуют и/или просто ошибаются.

Это исходная строка SQL, которую я хочу перевести в спящий режим: "UPDATE WAREHOUSE SET product_count =" + count + "WHERE product_name = '" + product + "';"

+0

Не могли бы вы поделиться своим отображение Hibernate сущностей в XML, вероятно, потому что я не вижу JPA/Hibernate аннотации в классе сущностей. А также ошибка/проблема, которую вы сейчас имеете. –

+0

Добавлен файл сопоставления в исходное сообщение. – daZza

ответ

0

Я прочитал еще больше примеров и документов и придумал следующее, что, я думаю, сейчас работает. По крайней мере, нет сообщений об ошибках, и сообщения журнала спящего режима выглядят хорошо.

К сожалению, я не могу проверить, правильны ли данные в базе данных, поскольку я не понял, как преобразовать результаты запроса снегохода (объекты) в читаемые материалы, такие как строка.

Я также сменил свой первичный ключ в файле сопоставления спящего режима на имя 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); 

} 
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

Спасибо. И я также могу использовать этот класс ограничений для обновления таблицы? Это самая запутанная вещь для меня о спящем режиме ... Нет функции select/update/delete/...: D – daZza

+0

Для обновлений я бы рекомендовал использовать 'session.createQuery' для запросов HQL или' session.createSQLQuery 'для собственного SQL. Вы можете добавить параметры к запросу, используя полуточку, например. 'где product_name =: productName' (для собственного SQL). Затем вы можете установить значения параметров с помощью 'query.setParameter (" procuctName ", product.getProductName())' или использовать определенные типы данных, такие как 'query.setLong (...)' См. Документы для [Родной 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