Hibernate - выборка из базы данных по языку - PullRequest
0 голосов
/ 20 января 2019

У меня есть приложение MVC, которое предназначено для интернационализации. У меня есть таблица MY_TABLE, содержащая поле word, которое я хотел бы перевести на несколько языков. Я создал следующую модель:

CREATE TABLE MY_TABLE(
    id int PRIMARY KEY,
    -- other fields that don't need to be translated
);
CREATE TABLE LANGUAGE(
    id VARCHAR(4) PRIMARY KEY -- eg en
);
CREATE TABLE MY_TABLE_WORD_TRANSLATION(
    id int PRIMARY KEY,
    language_id VARCHAR(4),
    my_table_id int,
    word_translation VARCHAR(100),
    FOREIGN KEY(language_id) REFERENCES LANGUAGE(id),
    FOREIGN KEY(my_table_id) REFERENCES MY_TABLE(id)
);

Теперь с Hibernate я создал соответствующие классы.

@Entity
@Table(name="LANGUAGE")
public class Language {
    private String id;

    public Language(){}
    public Language(String id) {
        super();
        this.id = id;
    }
    @Id
    @Column(nullable=false)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
} 

@Entity
@Table(name="MY_TABLE")
public class MyTable {
    private int id;

    public MyTable(){}
    public MyTable(int id) {
        super();
        this.id = id;
    }
    @GeneratedValue
    @Id
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}

@Entity
@Table(name="MY_TABLE_WORD_TRANSLATION")
public class MyTableWordTranslation {
    private int id;
    private String translation;
    private Language language;
    private MyTable myTable;

    public MyTableWordTranslation() {}
    public RegionNameTranslation(int id, String translation, Language language, MyTable myTable) {
        super();
        this.id = id;
        this.translation = translation;
        this.language = language;
        this.myTable = myTable;
    }
    @GeneratedValue
    @Id
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(nullable=false)
    public String getTranslation() {
        return translation;
    }
    public void setTranslation(String translation) {
        this.translation = translation;
    }
    @ManyToOne
    @JoinColumn(name="language_id")
    public Language getLanguage() {
        return language;
    }
    public void setLanguage(Language language) {
        this.language = language;
    }   
    @ManyToOne
    @JoinColumn(name="my_table_id")
    public MyTable getMyTable() {
        return myTable;
    }
    public void setMyTable(MyTable myTable) {
        this.myTable = myTable;
    }
}

Итак, вопрос в том, как отобразить в MyTable поле MyTableWordTranslation, чтобы получить только нужный мне перевод:

  • Это в классе DAO, в запросах HQL, но тогда какой запрос я должен написать? На данный момент у меня есть SELECT mytable FROM MyTable mytable
  • Я пытался сопоставить с @OneToMany с помощью фильтра @Where, но как я могу установить параметр в этом фильтре: @Where(clause="language_id = 'en'")? Язык указывается в запросе GET от клиента.

Спасибо

1 Ответ

0 голосов
/ 22 января 2019

Предполагая, что ваше отображение работает, я думаю, что вы, возможно, захотите написать запрос, используя сущность MyTableWordTranslation, так как она владеет множеством в одну сторону, она получит искомый объект «MyTable».

  • Это в классе DAO, в запросах HQL, но какой запрос мне следует написать? Сейчас у меня есть SELECT mytable ИЗ MyTable mytable

  • Я пытался сопоставить с @OneToMany фильтр @Where, но как я могу установить параметр в этом фильтре: @Where (clause = "language_id =
    'en' ")? Язык указывается в запросе GET из
    клиент.

В тех случаях, когда ваш запрос не создается во время выполнения, вы можете аннотировать свою сущность аннотацией @NamedQueries. Внутри вашей аннотации вы можете предоставить массив аннотаций @NamedQuery, которые имеют атрибуты «name» и «query». Атрибут name позволяет вам ссылаться на ваш запрос для значения запроса. В этом конкретном примере это будет выглядеть примерно так:

@NamedQueries(value = {@NamedQuery(name = "MyTableWordTranslation.getWordByLanguage", query = "SELECT mtwt.mytable FROM MyTableWordTranslation mtwt where mtwt.myTable.id=:wordId and mtwt.language.id = :languageId"), ...more queries, ., .}) @Entity @Table(name="MY_TABLE_WORD_TRANSLATION") public class MyTableWordTranslation {

Теперь, когда вы захотите использовать этот запрос, вы можете получить к нему доступ через менеджера сущностей в вашем DAO следующим образом.

Query query = entityManager.createNamedQuery("MyTableWordTranslation.getWordByLanguage");
query.setParameter("wordId", wordId);
query.setParameter("languageId", languageId);

MyTable mt = (MyTable) query.getSingleResult();

Вот ссылка, которая должна помочь лучше объяснить NamedQueries: https://www.javatpoint.com/hibernate-named-query

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...