2010-09-17 6 views
0

J'ai une requête qui ressemble à ceciHibernate retourner un autre objet

Document document = DocDAO.getSession().read(someId); 
MyFile file = (MyFile) DAO.getSession() 
.createQuery("SELECT file FROM MyFile file WHERE file.document = :document AND file.version = :version") 
.setParameter("document", document) 
.setParameter("version", version) 
.uniqueResult(); 

Maintenant, je devrais obtenir un fichier où == someId et someId est un BigInteger file.getDocument(). GetId(). Mais malheureusement, ils ne sont pas égaux. Quel genre d'erreurs peut conduire à ce que l'entité interrogée ne soit pas l'entité que je recherchais?

Vive

Nik

+0

Quel type de données de base de données est l'ID? –

+0

id est un mysql bigint (20) – niklassaers

+0

Cela devrait fonctionner. Quel SQL est effectué? Voir [cette question] (http://stackoverflow.com/questions/2536829/hibernate-show-real-sql) pour activer la journalisation SQL. –

Répondre

1

BigInteger est un objet, et non pas une primitive. Vous devrez peut-être faire bigInt1.equals(bigInt2) plutôt que bigInt1 == bigInt2.

EDIT:
Peut-être que je me trompe à ce sujet. Javadoc dit:

BigInteger fournit des analogues à tous les opérateurs entiers primitifs de Java

EDIT DE NOUVEAU: Si vous voulez en finir avec BigInteger, essayez de déclarer votre attribut d'entité JPA comme Long (ou long si elle n'est pas valide), puis utilisez l'annotation @Column pour définir la structure réelle de la colonne de base de données si nécessaire. Voici un exemple de cette annotation:

@Column(updatable = false, name = "MY_DB_COLUMN", nullable = false, length=12) 
private long myEntityAttribute; 

Je ne me souviens pas exactement comment utiliser l'attribut length lorsque la colonne est numérique. Max nombre de chiffres? Vous pouvez rechercher les détails pour @Column et expérimenter jusqu'à ce que vous obtenez le droit.

+0

Je n'ai pas utilisé BigInteger, mais je suis sûr que vous aviez raison la première fois. "Fournit des analogues" n'est pas la même chose que "remplace l'opérateur' == '" - ce que vous ne pouvez pas faire en Java. –

+0

Alors, que dois-je utiliser à la place de bigint dans MySQL ou BigInteger? J'adorerais utiliser un long, mais je ne sais pas à quoi cela correspondrait dans MySQL, et mes identifiants sont trop longs pour un entier – niklassaers

+0

Vous pouvez remplacer le mappage par défaut du type de base de données par le type d'entité Java. J'ai généré les entités JPA sur mon projet actuel à partir d'Eclipse, et je pense que BigInteger était la valeur par défaut pour les colonnes numériques non décimales. Je les ai juste changés en long (ou long) sans modifier le schéma de base de données. Vous aurez seulement un problème si une valeur de colonne de base de données dépasse Long.MAX_VALUE, qui est très grande. –

Questions connexes