2017-02-22 63 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查詢:

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:
實體類
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個表創建了5個POJO類?發佈它們以便我可以發佈相關查詢 – Akshay

+0

是的,我有(4桌),好吧,我會,你需要等待, –

+0

@Akshay我已經添加了實體類的代碼片段 –

回答

0

,如果這是工作,因爲我看不到客戶端類的參考,我不舒爾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

ty,我會試試這個,讓你知道 –

+0

'我看不到參考客戶端類和ClientDomain類.' - >它們之間沒有關係,所以我得到了異常**無法解決的屬性:客戶端的ClientDomain ** –

+0

Ty爲了付出努力,現在我已經使用了原生的sql查詢 –