Il n'y a pas de point à l'aide de requêtes HQL pour ce faire, vous pouvez utiliser SQL directe si vous voulez le faire, par le biais d'une requête JDBC (ou même par le biais d'une requête hql, vous pouvez utiliser des requêtes SQL).
Une manière orientée objet serait de charger votre objet à l'aide de requêtes HQL, faites ce que vous devez faire dans le monde Java (columnValue +=10, quelle que soit la chose que vous devez faire), et puis persister en arrière en utilisant la session hibernate rincer.
Je suppose qu'il implique plus d'opérations il est donc moins efficace (en performance pure), mais en fonction de votre Hibernate configuration (mise en cache, le regroupement, le cache de second niveau, etc.) il pourrait être beaucoup mieux. Pour ne pas mentionner plus testable, bien sûr.
Merci beaucoup pour votre explication. Que penseriez-vous si nous avons une utilisation normale de la requête HQL et ne va pas sur type Objectif pour une ou quelques lignes de mise à jour.Serait-il moins efficace? Pensez-vous à l'aide de requêtes HQL et HQL objectif requêtes de type sont les mêmes dans le processus de @ back-end?
Comme disent les autres, il y a de meilleures façons, mais si vous devez, par exemple, avec la syntaxe suivante:
update EntityName m set m.salary = m.salary +10 where m.id =1
comment pouvons-nous mettre à jour plus d'un attribut de l'objet ? Aussi simplement que de simplement définir plusieurs valeurs: mise à jour EntityName m attrA = 1, attrB=2, attrC = 3 où m.id = 1 remarque, les noms de champs sont sensibles à la casse.
La requête HQL devrait vous paraître assez similaire, sauf qu'au lieu d'utiliser des noms de table et colonne, vous devez utiliser l'entité et les noms de propriété (c'est à dire tout ce que vous utilisez en Java).
En plus de Adam Batkin réponse, je tiens à ajouter que de telles requêtes ne sont généralement pas utilisés (sauf si vous avez besoin de modifier un ensemble de loat de lignes à la fois) en mode veille prolongée. L'objectif de Hibernate est de travailler avec des objets. Donc, vous n'avez généralement:
MyEntity m =(MyEntity) session.get(MyEntity.class,"001");
m.setValue(m.getValue()+10);//and the new value will automatically be written to database at flush time
Merci pour votre exemple de code.souhaitez-vous mentionner sur le nom de la colonne ou de la personne morale nom de la variable? Je n'ai vraiment pas besoin de faire un argument ici,mais je veux obtenir les choses au clair.(Si vous pensez que ce serait un argument,alors pas besoin de réponse).que pensez-vous lors de la mise à jour se fait avec 1.normal requête sql ? ou 2.normal requête hql? considérant 1.performance et efficacité et 2.nombre de mise à jour des lignes? Merci beaucoup Vous avez juste une ligne pour mettre à jour dans votre exemple, et il est accessible par sa clé primaire. À l'aide d'un dédié HQL ou d'une requête SQL à faire, c'est juste le combat contre Hibernate, et de ne pas obtenir quoi que ce soit à l'exception de complexité supplémentaire. Vous perdrez lot de mise à jour, et de l'accès concurrentiel optimiste. Ne luttez pas contre la mise en veille prolongée. Optimiser uniquement lorsque cela est nécessaire et quand yiou avons mesuré, il a été utile.
Il n'y a pas de point à l'aide de requêtes HQL pour ce faire, vous pouvez utiliser SQL directe si vous voulez le faire, par le biais d'une requête JDBC (ou même par le biais d'une requête hql, vous pouvez utiliser des requêtes SQL).
À l'aide de requêtes HQL pour la mise à jour n'est recommandé que lorsque vous faites des mises à jour par lot, pas une seule ligne.
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-direct
Une manière orientée objet serait de charger votre objet à l'aide de requêtes HQL, faites ce que vous devez faire dans le monde Java (columnValue +=10, quelle que soit la chose que vous devez faire), et puis persister en arrière en utilisant la session hibernate rincer.
Je suppose qu'il implique plus d'opérations il est donc moins efficace (en performance pure), mais en fonction de votre Hibernate configuration (mise en cache, le regroupement, le cache de second niveau, etc.) il pourrait être beaucoup mieux. Pour ne pas mentionner plus testable, bien sûr.
OriginalL'auteur Guillaume
Comme disent les autres, il y a de meilleures façons, mais si vous devez, par exemple, avec la syntaxe suivante:
Aussi simplement que de simplement définir plusieurs valeurs: mise à jour EntityName m attrA = 1, attrB=2, attrC = 3 où m.id = 1
remarque, les noms de champs sont sensibles à la casse.
OriginalL'auteur Mikko Maunu
La requête HQL devrait vous paraître assez similaire, sauf qu'au lieu d'utiliser des noms de table et colonne, vous devez utiliser l'entité et les noms de propriété (c'est à dire tout ce que vous utilisez en Java).
OriginalL'auteur Adam Batkin
En plus de Adam Batkin réponse, je tiens à ajouter que de telles requêtes ne sont généralement pas utilisés (sauf si vous avez besoin de modifier un ensemble de loat de lignes à la fois) en mode veille prolongée. L'objectif de Hibernate est de travailler avec des objets. Donc, vous n'avez généralement:
Je n'ai vraiment pas besoin de faire un argument ici,mais je veux obtenir les choses au clair.(Si vous pensez que ce serait un argument,alors pas besoin de réponse).que pensez-vous lors de la mise à jour se fait avec 1.normal requête sql ? ou 2.normal requête hql? considérant 1.performance et efficacité et 2.nombre de mise à jour des lignes? Merci beaucoup
Vous avez juste une ligne pour mettre à jour dans votre exemple, et il est accessible par sa clé primaire. À l'aide d'un dédié HQL ou d'une requête SQL à faire, c'est juste le combat contre Hibernate, et de ne pas obtenir quoi que ce soit à l'exception de complexité supplémentaire. Vous perdrez lot de mise à jour, et de l'accès concurrentiel optimiste. Ne luttez pas contre la mise en veille prolongée. Optimiser uniquement lorsque cela est nécessaire et quand yiou avons mesuré, il a été utile.
OriginalL'auteur JB Nizet
S'il vous plaît essayer ce un
En Ce Qui Concerne,
Lavanyavathi.Bharathidhasan
OriginalL'auteur Lavanyavathi