gpt4 book ai didi

java - JPA查询具有多对多关系的多个表

转载 作者:行者123 更新时间:2023-11-29 21:10:59 25 4
gpt4 key购买 nike

一共有三个表:Hospital , Medical_ServiceLanguage_Service ,医院可以提供医疗服务和语言服务。这样就有了两个多对多的关系。

Simple ERD

现在我想用 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。

警告:

ERROR: org.hibernate.hql.internal.ast.ErrorCounter - Path expected for join! Path expected for join! at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:378) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3858) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3644)

Apr 02, 2016 10:54:30 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [appServlet] in context with path [/travel] threw exception [Request processing failed; nested exception is 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 JOIN Medical_Service m ON h.hospital_id = m.hospital_id WHERE h.Postcode = :postcode AND m.Medical_name = :medical]] with root cause org.hibernate.QueryException: could not resolve property: Postcode of: com.health.entity.Hospital at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77) at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978) at org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java:367)

医院.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
}

语言.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
}

最佳答案

我认为您的查询可能是错误的,这可能是问题的原因。

您当前正在使用:

 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

问题可能是 Medical_Service 不包含 Hospital_id 字段(在 JOIN 中使用)。

如果您愿意使用 native 查询,您可以这样做:

 SELECT * FROM Hospital WHERE Postcode = 3000 AND Hospital_id IN
(SELECT Hospital_id FROM Hospital_Medical hm INNER JOIN Medical_Service m ON hm.Medical_id = m.Medical_id
where Medical_name = 'Emergency')

内部 SELECT 获取提供紧急服务的医院的所有 Hospital_id。然后,外部选择会选择 Hospital_id 位于内部选择中的所有医院(即,它们提供紧急服务),但也仅选择邮政编码为 3000 的医院。

要使用 native 查询,您需要执行以下操作:

    int postcode = 3000;
String service = "Emergency";

StringBuilder sb = new StringBuilder();
sb.append("SELECT * FROM Hospital WHERE Postcode = ");
sb.append(postcode);
sb.append("AND Hospital_id IN SELECT Hospital_id FROM Hospital_Medical hm INNER JOIN "
+ "Medical_Service m ON hm.Medical_id = m.Medical_id where Medical_name = '");
sb.append(service);
sb.append("')");

String queryString = sb.toString();
Query query = em.createNativeQuery(queryString);
List<Hospital> result = query.getResultList();

关于java - JPA查询具有多对多关系的多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36373154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com