суббота, 5 июня 2010 г.

Выполнение хронимых процедур MS SQL в JavaEE 6 (JSF2)

Возникла задача, выполнения хранимых процедур из базы MS SQL 2005 в коде моего проекта.
Долгое время бился над этим, но все-таки нащел решение.

Использовал:
NetBeans 9.2 RC2
JDBC MSQSQL version 3


Пример:

1. Класс сушности
package model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.eclipse.persistence.annotations.Direction;
import org.eclipse.persistence.annotations.NamedStoredProcedureQuery;
import org.eclipse.persistence.annotations.StoredProcedureParameter;

@Entity
@NamedStoredProcedureQuery(name = "rpt_ret_test",
resultClass = MyEntity.class,
returnsResultSet = true,
procedureName = "rpt_ret_test",
parameters = {
@StoredProcedureParameter(name = "item",
queryParameter = "item", direction = Direction.IN, type = String.class)
})
public class MyEntity implements Serializable {

@Id
@Column(name = "item")
private String item;

public String getItem() {
return item;
}

public void setItem(String item) {
this.item = item;
}
}


2. Класс фасада
package controller;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import model.MyEntity;

@Stateless
public class MyEntityFacade {

@PersistenceContext(unitName = "ewqPU")
private EntityManager em;

public List customize()
throws Exception {
try {
Query query = em.createNamedQuery("rpt_ret_test");
query.setParameter("item", "sdsds Мой тестовый параметр :)");
return query.getResultList();
} catch (Exception ex) {
throw ex;
}
}
}


3. Класс предоставления данных (ViewEntity)
package controller;

import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import model.MyEntity;

@ManagedBean(name = "MyEntityView")
@RequestScoped
public class MyEntityView {

@EJB
private MyEntityFacade myEntityFacade;

public List getMyEntityFacade() throws Exception {
return myEntityFacade.customize();
}


}


4. Вывод данных на экран

в xhtml через баловый вывод JSF Entity Data table


P.S: Заработало толька на GlassFishe который щел в комплекте с NetBeans 6.9 RC2
в остальных случиях шли непонятные ошибки.
не забывайте в процедурах писать SET NOCOUNT ON ;)



Тест выполняемой процедуры
Create Procedure dbo.RPT_RET_test (@Item NVARCHAR(50))
AS
BEGIN
SELECT @item
END


PS: так как вывод быдет произведен 1 раз можно не писать SET NOCOUNT ON