2011-07-29 3 views
0

J'ai un problème pour obtenir cette liste de résultats de la requête. La requête me renvoie un objet null. Je n'ai aucune idée de pourquoi cela arrive. Mais si je commente sa déclaration WHERE son travail bien, mais j'ai deux Enum qui peuvent spécifier le résultat. Je pense que je suis d'abord avec elle, et google n'a pas donné de réponse, sauf pour utiliser NamedQuery. Ceci est mon code:Java Query et Enum

@Transactional(readOnly = true, propagation = Propagation.REQUIRED) 
public DeviceProfileAttribute getRandomDeviceProfileAttribute(Category category, Platform platform) { 

    Query q = em.createQuery("SELECT d FROM DeviceProfileAttribute d " + 
      "WHERE d.tenantAttribute.attribute.category=:category AND " + 
      "d.tenantAttribute.attribute.platform=:platform " + 
      "ORDER BY RAND()"); 
    q.setParameter("category", category); 
    q.setParameter("platform", platform); 
    q.setMaxResults(1); 
    if (q.getResultList().isEmpty()) { 
     return null; 
    } else { 
     return (DeviceProfileAttribute) q.getResultList().get(0); 
    } 

} 

Je suis sûr que null n'est pas une seule réponse.

Merci d'avance.

P.S Peut-être quelqu'un maintenant pour vérifier cette requête après avoir mis tous les paramètres?

P.P.S Le problème consiste à utiliser Enum et ORDER by RAND() dans une requête SQL.

+1

'select d' est pas valide SQL. Vous ne pouvez pas sélectionner un nom de table à partir d'un nom de table. –

+0

mais il ne donne pas d'erreur, je pense que si elle, il donnera une sorte d'exception. – e8kor

+3

@Paul: 'SELECT d' est valide JPQL. –

Répondre

0

La seule façon pour moi, est d'utiliser ce code:

@Transactional(readOnly = true, propagation = Propagation.REQUIRED) 

public DeviceProfileAttribute getRandomDeviceProfileAttribute(Category category, Platform platform) { 

Query q = em.createQuery(
     "SELECT d FROM DeviceProfileAttribute d " + 
     "WHERE d.tenantAttribute.attribute.category=:category AND " + 
     "d.tenantAttribute.attribute.platform=:platform " 
); 
q.setParameter("category", category); 
q.setParameter("platform", platform); 
if (q.getResultList().isEmpty()) { 
    return null; 
} else { 
    return (DeviceProfileAttribute) q.getResultList().get(new Random().nextInt(q.getResultList().size()));; 
} 

}