HqlInterface
HQL
Allgemeines
Informationen
- HQL (Hibernate Query Language) ist eine Abfragesprache, mit der man Klassen und Objekte direkt ansprechen kann, ohne deren Namen in der Datenbank kennen zu müssen (z.B. "project.pr_id" anstatt "DI001001 FROM DT461").
- Abfragen werden intern in SQL-Statements übersetzt und ausgeführt.
- HQL-Namen können aus dem Data Dictionary, den Entity-Namen (für Tabellen) bzw. DI-Python-IDs (für Spalten) ausgelesen werden.
Hinweise
- Über HQL werden lediglich SQL-Abfragen direkt an die Datenbank abgesetzt. Weitergehende Funktionalitäten von PLANTA project, wie z.B. abhängiges Speichern oder Löschen, ist dadurch nicht möglich.
- Wird z.B. ein Projekt über HQL gelöscht, werden die untergeordneten Projektstrukturen nicht automatisch mitgelöscht.
- Generell verwendet PLANTA project derzeit die Hibernate-Version 4.3.4 mit den darin enthaltenen Funktionalitäten inkl. HQL: http://hibernate.org/orm/documentation/4.3.
Modul HQL
Information
- Um HQL verwenden zu können, muss zuerst das hql-Modul importiert werden.
Beispiel (classic)
from hql import hql
or (preferred)
import hql
Methoden
Information
- Für HQL stehen drei Funktionen zur Verfügung.
search_record
Details
- Diese Methode gibt eine Liste von DTP Records zurück.
hql.search_record(String hql, Dictionary parameters)
Beispiel
pars = { 'pr_id' : '4811' }
project = hql.search_record("from Project project where project.pr_id = :pr_id", pars)
query
Details
- Diese Methode gibt eine Liste von Daten (in Listenform) zurück, entsprechend
db_select()
.
hql.query(String hql, Dictionary parameters)
Beispiel
pars = { 'pr_id' : '4811' }
project_data = hql.query("select project.pr_id, project.project_name from Project project where project.pr_id = :pr_id", pars)
modify
Details
- Mit dieser Methode können Update- bzw. Delete-Statements durchgeführt werden. Zurückgegeben wird die Anzahl der Änderungen in der DB, entsprechend
db_modify()
.
hql.modify(String hql, Dictionary parameters)
Beispiel Update:
pars = { 'pr_id' : '4811', 'pr_name' : 'new_name' }
hqlString="update Project project set project.project_name = :pr_name where project.pr_id = :pr_id"
hql.modify(hqlString, pars)
Beispiel Delete:
pars = { 'mod_id' : module.id.get_value() }
hql.modify("delete Module m where m.id_ = :mod_id", pars)
Hinweise
- Properties werden in HQL nur über Python-IDs identifiziert.
- Namen wie "id","class", "enum", "const" sind von Hibernate und Java reserviert. Auf alle Python-IDs, die diese Namen verwenden, kann man in HQL mit Python-ID und Unterstrich zugreifen, z.B. ("id_").
- Anstatt Tabellennamen werden die Namen der Entitäten verwendet.
Dokumentation zu HQL
Informationen
- In HQL verwendet man anstatt dem Tabellenamen den Entitätsnamen und anstatt dem Spaltennamen den Property-Namen.
- Den Entitätsnamen kann man im Data Dictionary (Feld Entity-Name) nachlesen. Falls er nicht eingetragen ist, dann ist der Entitätsname DTxxx.
- Die Entitäten sind in PLANTA project momentan noch nicht über Associations miteinander verknüpft. Dies bedeutet, dass Joints zwischen diesen nicht genutzt werden können.
- Der Property-Name entspricht dem der DI-Python-ID. Falls diese nicht eingetragen ist, dann ist der Property-Name "DIxxxxx".
- parameters sind optionale Dictionaries, mit denen Parameter des HQL-Statements übergeben werden können. Siehe hierzu Bindevariablen in Statements.
Beispiel
pars = { 'pr_id' : '4811' }
project = hql.search_record("from Project p where p.pr_id = :pr_id", pars)
- In HQL sollen die UUIDs als Strings übergeben werden.
Beispiel
import hql
from ppms import ppms
project_record = ppms.search_record(461, ['4811'], ['uuid'])
uuid = project_record.uuid.get_value()
pars = { 'pr_uuid' : uuid }
query = "SELECT project.project_name from Project project where project.id = :pr_uuid"
result = hql.query(query, pars)
ppms.ui_message_box(result) # [['Schleppkettenanlage']]
Hinweis
- Weitere Informationen hierzu finden Sie in der offiziellen HQL-Dokumentation.
Vorteile von hql.search_record und ppms.search_record
ppms.search_record()

- Geht nur auf die Datenbank, falls der Record nicht vollständig existiert.
hql.search_record()

- Suche auf mehr als einem Record.
- Suche nicht auf den Primärschlüssel beschränkt, sondern kann alles, was auch in einer HQL where-Klausel möglich ist.