【发布时间】:2016-07-22 06:04:53
【问题描述】:
共有三个表:Hospital、Medical_Service和Language_Service,
医院可提供医疗服务和语言服务。所以有两个多对多关系。
现在我想用postcode = 3000 和medical service = Emergency 搜索医院数据。
DaoImpl:
public List<Hospital> findByPostcodeAndMedicalType(String postcode, String medical) {
String str = "SELECT h FROM Hospital h INNER JOIN Medical_Service m ON h.hospital_id = m.hospital_id WHERE "
+ "h.Postcode = :postcode AND m.Medical_name = :medical";
Query query = em.createQuery(str);
query.setParameter("postcode", postcode);
query.setParameter("medical", medical);
return query.getResultList();
}
另外,如果我想从三个表中按邮政编码、医疗类型和语言进行搜索,如何写一个jsql。
警告:
错误:org.hibernate.hql.internal.ast.ErrorCounter - 预期加入的路径! 预计加入的路径! 在 org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:378) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3858) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3644)
2016 年 4 月 2 日晚上 10:54:30 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet [appServlet] 在路径 [/travel] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: Postcode of: com.health.entity.Hospital [SELECT h FROM com.health.entity.Hospital h INNER加入 Medical_Service m ON h.hospital_id = m.hospital_id WHERE h.Postcode = :postcode AND m.Medical_name = :medical]] 与根本原因 org.hibernate.QueryException:无法解析属性:邮政编码:com.health.entity.Hospital 在 org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) 在 org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77) 在 org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978) 在 org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)
Hospital.class
@Entity
@Table(name = "Hospital")
public class Hospital {
@Id
@GeneratedValue
private int hospital_id;
private String hospital_name;
private String postcode;
private String suburb;
private String address;
private String type;
private String category;
private String longitude;
private String latitude;
private String email;
private String website;
private String phoneno;
private String isemergency;
private String agencytype;
private String fax;
@ManyToMany
@JoinTable(
name = "Hospital_Medical",
joinColumns=@JoinColumn(name="Hospital_id", referencedColumnName="Hospital_id"),
inverseJoinColumns=@JoinColumn(name="Medical_id", referencedColumnName="Medical_id"))
private List<MedicalService> services;
@ManyToMany
@JoinTable(
name = "Hospital_Language",
joinColumns=@JoinColumn(name="Hospital_id", referencedColumnName="Hospital_id"),
inverseJoinColumns=@JoinColumn(name="Language_id", referencedColumnName="Language_id"))
private List<Language> languages;
//Setter and Getter
}
MedicalService.class
@Entity
@Table(name = "Medical_Service")
public class MedicalService {
@Id
private int medical_id;
private String medical_name;
private String description;
@ManyToMany(mappedBy="services")
private List<Hospital> hospitals;
//Setter and Getter
}
Language.class
@Entity
@Table(name = "Language")
public class Language {
@Id
private int language_id;
private String language_name;
private String display_name;
@ManyToMany(mappedBy="languages")
private List<Hospital> hospitals;
//Setter and Getter
}
【问题讨论】:
-
无法告诉您为什么找不到 CLASS 医院的字段“邮政编码”,因为我看不到 CLASS。也许FIELD不叫邮政编码?毕竟 JPQL 使用 CLASSES 和 FIELDS 而不是 TABLES 和 COLUMNS。
-
上面添加了三个实体
-
所以没有名为“邮政编码”的字段。有一种叫做“邮编”。名称在 Java 中区分大小写,在 JPQL 中也是如此。你的“加入”也是错误的......你通过关系加入,而不是使用 ON 和列
标签: java mysql spring hibernate jpa