私は多くのプロジェクトで Hibernate を使用しています。以来、私は翻訳テーブルを含むプロジェクトを開発してきました。翻訳テーブルには、それを必要とする他のすべてのテーブルのすべての言語のテキスト値が含まれています。
変換テーブルのマッピング ファイル
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true" name="com.spectotechnologies.website.common.helper.TranslationValue" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="common_translations">
<id name="keyTranslation">
<generator class="native"/>
</id>
<property name="keyLanguage"/>
<property name="tableName"/>
<property name="fieldName"/>
<property name="keyRow"/>
<property name="value"/>
</class>
</hibernate-mapping>
翻訳が必要なオブジェクトの例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true" name="com.spectotechnologies.website.common.helper.Category" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="common_categories">
<id name="keyCategory">
<generator class="native"/>
</id>
<property name="keyParent"/>
<property name="tag"/>
<property name="name" insert="false" update="false"/>
<property name="description" insert="false" update="false"/>
</class>
</hibernate-mapping>
現在、この種のSQLクエリを使用してオブジェクトをロードしています
"SELECT" +
" c.keyCategory," +
" c.keyParent," +
" c.tag," +
" tn.value AS name," +
" td.value AS description" +
" FROM common_categories c" +
// name
" LEFT JOIN common_translations tn" +
" ON tn.tableName = 'common_categories'" +
" AND tn.fieldName = 'name'" +
" AND tn.keyRow = c.keyCategory" +
" AND tn.keyLanguage = ?" +
// description
" LEFT JOIN common_translations td" +
" ON td.tableName = 'common_categories'" +
" AND td.fieldName = 'description'" +
" AND td.keyRow = c.keyCategory" +
" AND td.keyLanguage = ?" +
" ORDER BY" +
" c.keyCategory ASC"
この種の LEFT JOINS をマッピング内に転送できるかどうか疑問に思っていました。そのためには、tableName、fieldName、language というパラメーターを含める必要があります。
それについてのあなたの助けは大歓迎です。私は多くのクエリを簡素化することができます!
編集 :
これが私が期待するものの例です:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true" name="com.spectotechnologies.website.common.helper.Category" optimistic-lock="version" polymorphism="implicit" select-before-update="false" table="common_categories">
<id name="keyCategory">
<generator class="native"/>
</id>
<property name="keyParent"/>
<property name="tag"/>
<one-to-many class="com.spectotechnologies.website.common.helper.TranslationValue"
formula="tableName = 'common_categories' AND fieldName = 'name' AND keyLanguage = @language AND keyRow = keyCategory" name="name" />
<one-to-many class="com.spectotechnologies.website.common.helper.TranslationValue"
formula="tableName = 'common_categories' AND fieldName = 'description' AND keyLanguage = @language AND keyRow = keyCategory" name="description" />
</class>
</hibernate-mapping>
その場合、クエリ時に挿入できる変数 @language を作成する必要があります。このソリューションには 2 つの問題があります。
変数をマッピング スコープに公開できるかどうかはわかりません。
式は今のところ存在しません: https://hibernate.onjira.com/browse/HHH-944