utilisation de entityManager.createNativeQuery(requête,foo.classe)
je voudrais retourner une liste D'entiers à partir d'un
javax.persistence.EntityManager.createNativeQuery
appel
pourquoi ce qui suit est incorrect?
entityManager.createNativeQuery("Select P.AppID From P", Integer.class);
précisément pourquoi suis-je "...Entité inconnue: java.lang.Integer"
je dois créer une classe d'entité qui a un seul champ est un Entier ?
Merci
5 réponses
Ce que vous faites est appelé projection. C'est quand vous retournez seulement un scalaire valeur qui appartient à une entité. Tu peux le faire avec JPA. Voir valeur scalaire.
je pense que dans ce cas, en omettant le type d'entité au total, c'est possible:
Query query = em.createNativeQuery( "select id from users where username = ?");
query.setParameter(1, "lt");
BigDecimal val = (BigDecimal) query.getSingleResult();
Exemple tiré de ici.
cela ne fonctionne pas parce que le second paramètre devrait être une entity mappée et bien sûr Integer n'est pas une classe persistante (puisqu'il n'a pas l'annotation @Entity dessus).
pour vous, vous devriez faire ce qui suit:
Query q = em.createNativeQuery("select id from users where username = :username");
q.setParameter("username", "lt");
List<BigDecimal> values = q.getResultList();
ou si vous souhaitez utiliser les requêtes HQL vous pouvez faire quelque chose comme ceci:
Query q = em.createQuery("select new Integer(id) from users where username = :username");
q.setParameter("username", "lt");
List<Integer> values = q.getResultList();
salutations.
SQL
CREATE PROCEDURE getStateByName (IN StateName VARCHAR(128))
DYNAMIC RESULT SETS 1
P1: BEGIN
-- Declare cursor
DECLARE State_Cursor CURSOR WITH RETURN for
-- #######################################################################
-- # Replace the SQL statement with your statement.
-- # Note: Be sure to end statements with the terminator character (usually ';')
-- #
-- # The example SQL statement SELECT NAME FROM SYSIBM.SYSTABLES
-- # returns all names from SYSIBM.SYSTABLES.
-- ######################################################################
SELECT * FROM COUNTRY.STATE
WHERE PROVINCE_NAME LIKE UPPER(stateName);
-- Cursor left open for client application
OPEN Province_Cursor;
END P1
Java
//Country is a db2 scheme
//Now here is a java Entity bean Method
public List<Province> getStateByName(String stateName) throws Exception {
EntityManager em = this.em;
List<State> states= null;
try {
Query query = em.createNativeQuery("call NGB.getStateByName(?1)", Province.class);
query.setParameter(1, provinceName);
states= (List<Province>) query.getResultList();
} catch (Exception ex) {
throw ex;
}
return states;
}
Supposons que votre requête est " select id, name from users where rollNo = 1001".
ici la requête retournera un objet avec la colonne id et nom. Votre classe de réponse est comme ci-dessous:
public class UserObject{
int id;
String name;
String rollNo;
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}
ici UserObject
le constructeur obtiendra un tableau D'objets et définira les données avec l'objet.
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
votre fonction d'exécution de requête est comme ci-dessous:
public UserObject getUserByRoll(EntityManager entityManager,String rollNo) {
String queryStr = "select id,name from users where rollNo = ?1";
try {
Query query = entityManager.createNativeQuery(queryStr);
query.setParameter(1, rollNo);
return new UserObject((Object[]) query.getSingleResult());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
Ici, vous devez importer soufflet des paquets:
import javax.persistence.Query;
import javax.persistence.EntityManager;
Maintenant votre classe principale, vous devez appeler cette fonction.
Tout d'abord, vous devez obtenir EntityManager et appeler cela getUserByRoll(EntityManager entityManager,String rollNo)
fonction. L'appel de la procédure est donnée ci-dessous:
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
Maintenant vous avez des données dans ce userObject.
Voici les Importations
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
Remarque:
requête.getSingleResult () retourner un tableau. Vous devez maintenir la position de la colonne et de données type.
select id,name from users where rollNo = ?1
requête renvoie un tableau et il est [0] --> id and [1] -> name
.
pour plus d'information, visitez cette Réponse
Merci :)
JPA a été conçu pour fournir une correspondance automatique entre les objets et une base de données relationnelle. Puisque Integer n'est pas une entité persistante, pourquoi avez-vous besoin d'utiliser JPA ? Une simple demande JDBC fonctionne très bien.