2017-02-22 16 views
0

На самом деле я получить результаты с помощью Entity классов (я не знаю много о запрашивая присоединяется), однако следующие таблицы не создаются из Моих Entity классов (кроме meetingschedule) Теперь я хочу присоединиться таблицы, я застрял при получении результатов Мои таблицы следующим образом:Преобразовать SQL JOIN запрос HQL запрос Регистрация

mysql> desc meetingschedule; 
+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| meeting_id | int(11)   | NO | PRI | NULL | auto_increment | 
| meeting_date | date    | YES |  | NULL |    | 
| status  | tinyint(1)  | YES |  | NULL |    | 
| client_id | int(10) unsigned | YES | MUL | NULL |    | 
| remark_id | int(10) unsigned | YES | MUL | NULL |    | 
+--------------+------------------+------+-----+---------+----------------+ 
13 rows in set (0.03 sec)             

mysql> desc client; 
+-----------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+------------------+------+-----+---------+----------------+ 
| client_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| firm_name | varchar(90)  | NO |  | NULL |    | 
| is_active | char(1)   | YES |  | NULL |    | 
| parent_id | int(10) unsigned | YES |  | NULL |    | 
+-----------+------------------+------+-----+---------+----------------+ 
11 rows in set (0.01 sec) 

mysql> desc client_city; 
+-----------+------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-----------+------------------+------+-----+---------+-------+ 
| client_id | int(10) unsigned | NO | MUL | NULL |  | 
| city_id | int(10) unsigned | NO |  | NULL |  | 
+-----------+------------------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

mysql> desc client_domain; 
+-----------+------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-----------+------------------+------+-----+---------+-------+ 
| client_id | int(10) unsigned | NO |  | NULL |  | 
| domain_id | int(10) unsigned | NO |  | NULL |  | 
+-----------+------------------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

Как преобразовать SQL присоединиться к HQL?
Мой SQL Query является:

mysql> select a.* from meetingschedule a join client b on 
     a.client_id = b.client_id join client_city c on 
     b.client_id = c.client_id join client_domain d on 
     b.client_id = d.client_id where c.city_id=28 and d.domain_id=4; 

UPDATE:
Entity Классы
1. MeetingSchedule.java

@Entity 
@Table(name="meetingschedule") 
public class MeetingSchedule implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public MeetingSchedule() { 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="meeting_id") 
    private Integer meetingId; 

    @ManyToOne 
    @JoinColumn(
     name="client_id", columnDefinition="INT(10) UNSIGNED", 
     [email protected](name="fk_meetingschedule_client") 
    ) 
    private Client client; 

    @Column(name="status", columnDefinition="TINYINT(1)") 
    private short status; 

    @Column(name="meeting_date") 
    @Temporal(TemporalType.DATE) 
// @DateTimeFormat(pattern="yyyy-MM-dd") 
    private Date meetingDate; 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(name="meeting_employee", 
     joinColumns={@JoinColumn(name="meeting_id")}, 
     inverseJoinColumns={@JoinColumn(name="emp_id",columnDefinition="INT(10) UNSIGNED")}, 
     [email protected](name="fk_meeting_employee_meetingschedule_meeting_id"), 
     [email protected](name="fk_meeting_employee_employee_emp_id") 
    ) 
    private Set<Employee> employees = new HashSet<>(); 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(name="meeting_part", 
     joinColumns={@JoinColumn(name="meeting_id")}, 
     inverseJoinColumns={@JoinColumn(name="part_id",columnDefinition="INT(10) UNSIGNED")}, 
     [email protected](name="fk_meeting_part_meetingschedule_meeting_id"), 
     [email protected](name="fk_meeting_part_part_mst_part_id") 
    ) 
    private Set<Part> parts = new HashSet<>(); 
} 

2. Client.java

@Entity 
@Table(name="client") 
public class Client implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="client_id") 
    private String client_id; 

    @Column(name="is_active") 
    private String is_active; 

    @Column(name="parent_id") 
    private String parent_id; 

    @JsonBackReference 
    @OneToOne(cascade=CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private ClientCity clientCity; 

    @JsonBackReference 
    @OneToOne(cascade=CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    private ClientState clientState; 
} 

3. ClientCity

@Entity 
@Table(name="client_city") 
public class ClientCity implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator="fk_client_id") 
    @GenericGenerator(strategy="foreign", name="fk_client_id", [email protected](name="property", value="clientJoin")) 
    @Column(name="client_id") 
    private String client_id; 

    @Column(name="city_id") 
    private String city_id; 

    @OneToOne(mappedBy="clientCity") 
    private Client clientJoin; 

} 

4. ClientDomain

@Entity 
@Table(name="client_domain") 
@NamedQuery(name="ClientDomain.findAll", query="SELECT c FROM ClientDomain c") 
public class ClientDomain implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Column(name="client_id") 
    private int clientId; 

    @Column(name="domain_id") 
    private int domainId; 

    public ClientDomain() { 
    } 
} 
+1

Вы создали 5 классов POJO для 5 таблиц? Опубликуйте их, чтобы опубликовать соответствующий запрос. – Akshay

+0

Да, у меня есть (4 таблицы), нормально, я буду, вы не ожидаете, –

+0

@Akshay Я добавил фрагмент кода классов объектов –

ответ

0

Я не уверен, если это работает, потому что я не могу увидеть ссылку между классом Client и класс ClientDomain. И я думаю, что вы не можете использовать NamedQuery в соединении, потому что это вызовет SyntaxError.

Обычно ваш HQL запрос будет выглядеть следующим образом:

Query query = session.createQuery(
select a 
from MeetingSchedule a 
left join a.client b 
left join b.clientCity c 
left join b.clientDomain d 
where c.city_id = :city_id 
and d.domain_id = :domain_id) 
.setInteger("city_id", 28) 
.setInteger("domain_id", 4) 

Чтобы запросить его из БД вам нужен результат объект как:

List<MyQueryResult> result = new List<MyQueryResult>(); 

Чем вы можете получить данные из БД с помощью :

result = query.list(); 
+0

, я попробую это и дам знать –

+0

'Я не вижу ссылки между классом Client и ClientDomain class.' -> Нет отношения между ними, поэтому я получил исключение ** не удалось разрешить свойство: clientDomain of client ** –

+0

Ty для принятия мер, теперь я использовал собственный SQL-запрос –