2017-02-22 106 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查询 –