当前位置: 首页 > 面试题库 >

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

马朝斑
2023-03-14
问题内容

有三个表:HospitalMedical_Service并且Language_Service,医院能提供的医疗服务和语言服务。因此,存在两个多对多关系。

简单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。

警告:

错误:org.hibernate.hql.internal.ast.ErrorCounter-
预期加入的路径!希望加入的路径!在org.hibernate.org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3858)在org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:378)
.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3644)


2016年4月2日晚上10:54:30 org.apache.catalina.core.StandardWrapperValve在路径[/
travel]的上下文中为Servlet
[appServlet]调用SEVERE:Servlet.service()引发异常[请求处理失败;嵌套异常是java.lang.IllegalArgumentException:org.hibernate.QueryException:
无法解析属性:邮政编码 的:com.health.entity.Hospital
[从com.health.entity.Hospital中选择h在IN.JOIN JOIN Medical_Service中启用h.hospital_id
= m.hospital_id在哪里h.Postcode =:postcode和m.Medical_name
=:medical]根本原因是org.hibernate.QueryException:无法解析属性:org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)上com.health.entity.Hospital的邮政编码:org.hibernate.persister.entity
org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1978)的.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)在org.hibernate.hql.internal.ast.tree.FromElementType.getPropertyType(FromElementType.java
:367)

医院级

@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
}

语言类

@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中使用)。

如果您愿意使用本机查询,则可以执行以下操作:

 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。然后,外部选择会选择内部SELECT中具有Hospital_id的所有医院(即,它们提供紧急服务),但也会选择邮政编码为3000的医院。

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

    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();


 类似资料:
  • 我需要支持一个涉及以下实体的场景(使用JPA): 用户 一个用户可以有多个帐户,一个帐户可以在多个用户之间共享,这是迄今为止的标准@ManyToMany关系。 一个用户可以为每个帐户拥有一组不同的角色,一个角色可以在多个用户之间共享。 我遵循了这个实践,它解释了一种用额外列映射多对多关联的方法,但我不确定我是否得到了它。 用户实体: 账户实体: 用户帐户实体: 用户帐号: 我正在创建一个新用户并尝

  • 我在Eclipselink2.3.2中使用JPA2.0,在其中,我在产品和它们的颜色之间建立了多对多的关系。一个产品可以有多种颜色,一种颜色可以与多种产品相关联。这种关系在数据库中由三个表表示。 null 很明显,实体类有一组颜色-,它被命名为。 实体类有一组产品-,它被命名为。 我需要根据提供的与表中的颜色不匹配的从表中获取颜色列表。 对应的JPQL如下所示。 它生成以下SQL语句。 因为这将是

  • 我是新来laravel的,所以原谅我可能的愚蠢问题。此外,我确实研究了所有其他“类似”的问题,但要么它们没有重现正确的解决方案,要么我真的很难理解。 情景: 我有一个帖子模型和一个主题模型。这就是他们现在的样子。 在岗位上。php 在主题上。php 现在,我需要实现的是: 如果将查询参数传递给请求(即q=Food),我只想返回在主题关系中包含主题食物的帖子,而不返回其他帖子。如果什么都没有通过,那

  • 我有一个桌子实验和一个桌子标签。一个实验可能有许多标签。架构: 是否可以使用返回实验和相应标签列表的jooq创建查询? 类似

  • 我正在努力理解如何处理与JOOQ的一对多和多对多关系的Pojo。 我存储玩家创建的位置(一对多关系)。一个位置可以容纳多个可能访问它的其他玩家(多对多)。数据库布局可归结为以下内容: 在我的java应用程序中,所有这些信息都存储在一个pojo中。请注意,玩家和受邀玩家列表可以从应用程序中更新,也需要在数据库中更新: 我可以使用JOOQ的pojo映射将这三个记录映射到单个pojo吗?我可以使用这个p

  • 问题内容: 我在Java中有2个POJO类,Answer和Collaborator,具有多对多关系。 类有一套,但没有一套。我需要在Hibernate中进行的工作是找到合作者,以获得id给出的答案。 我已经使用结果转换器使用Hibernate ()进行了此操作,但是在使用时我陷入了困境,因为我没有要提供给联接的答案列表。 问题答案: 完成了,终于… 这是代码: