2017-08-28 2 views
0

Comment puis-je ajouter une colonne supplémentaire dans une requête JPA?
Supposons que nous ayons une table « utilisateurs » créé par pseudo-code suivant:JPA Ajouter des champs supplémentaires en appelant une fonction

create table users(name,birthdate); 

utilisateur entité JPA est quelque chose comme ceci:

@Entity 
@Table("users") 
public class User { 

    @Basic 
    @Column 
    private String name; 

    @Basic 
    @Column 
    private Date birthDate; 

    @Transient 
    private int age; 

    //getters and setters are here 
} 

Notez que le champ d'âge est exsists pas dans la table
Je veux écrire la requête suivante dans JQL en utilisant

entityManager.createQuery(jql) 

et de calculer l'âge sur la base de données

select u.*, sysdate-u.birthdate age from users 
+0

Normalement j'écrirais simplement une méthode 'public int getAge()'. Je ne sais pas pourquoi vous avez besoin de la base de données pour être impliqué ici. –

+0

C'est juste un échantillon.J'ai parlé de mon problème d'une manière simplifiée –

Répondre

0

Le problème est résolu.
Le texte de la requête est comme:

String jql = "select NEW entity.User(u.id, u.name, u.birthDate, sysdate-u.birthDate as age) from User u"; 


et aussi un constructeur approprié est ajouté à l'entité

public User(int id, String name, Date birthDate, double age) { 
    this.id = id; 
    this.name = name; 
    this.birthDate = birthDate; 
    this.age = age; 
} 

et utilise entitymanaget.createQuery (JQL) au lieu de createNativeQuery

0

usully i résoudre ce problème à l'aide de cette façon:

select new name.of.package.users(u.*, sysdate - u.birthdate as age) from users u; 

Modifier

Il conduit à ORA-00923: mot clé FROM introuvable où prévu Ma Recherche le texte est: String jql = "select new entity.User(u.*, sysdate-u.birthdate as age) from User u";

La requête contient une erreur:

select new entity.User(u.*, sysdate-u.birthdate as age) from User u 
//--------------------------------^^^ 
+0

Elle conduit à ORA-00923: mot clé FROM pas trouvé où prévu Mon texte de la requête est:. chaîne JQL = « select nouveau entity.User (u *, sysdate-u. date de naissance comme âge) de l'utilisateur u "; –

+0

avez-vous créé une requête JPQL ou native @OracleMan –

+0

J'ai testé les deux –

0

Peut-être à l'aide d'un DB-View pourrait aider. Voulez-vous que l'entité soit mise à jour? Serait-il raisonnable d'avoir une entité "en lecture seule" dérivée d'une sorte d'entité "de maintenance" qui contiendrait les colonnes calculées en utilisant une vue de base de données comme @Table?

create view usersview as name, birthdate, sysdate - birthdate as age from users; 

Entité:

@Entity 
@Table("usersview") 
public class UserExtended extends User { 

Si vous ne voulez pas deux entités-classes différentes (même quand on est dérivé de l'autre), il y aurait une exploration nécessaire comment JPA permet la mise à jour sur les vues , si le dbms le supporte (oracle le fait), je n'ai aucune expérience en la matière, désolé.

+0

Oui, c'est un bonne idée. Oracle prend en charge les vues modifiables. Les vues sont modifiables dans Oracle par défaut. Mais je cherche une meilleure solution –