java - JPA + 如何使用第三个表作为一对多关系中的联接来选择记录?

标签 java jpa orm

我正在尝试获取具有特定标签的所有Query对象。

<小时/>

实体类:

 public abstract class IdentifiableEntity implements Serializable{
        private long id;
        //set/get
      }

    public class Query extends IdentifiableEntity {
        private String query;
        private Set<Tag> tags;
        //set/get
     }

    public class Tag extends IdentifiableEntity {
        private String tagName;
        //set/get      
    }
<小时/>

表格:

 CREATE TABLE IF NOT EXISTS `mydb`.`tbl_map_query_tag` (
      `map_query_tag_id` INT NOT NULL AUTO_INCREMENT,
      `query_id` INT NOT NULL,
      `tag_id` INT NOT NULL,
      `comments` VARCHAR(100) NULL,
      `map_query_tag_fut1` VARCHAR(45) NULL,
      `map_query_tag_fut2` VARCHAR(45) NULL,
      PRIMARY KEY (`map_query_tag_id`),
      INDEX `fk_tbl_map_query_tag_tbl_query_idx` (`query_id` ASC),
      INDEX `fk_tbl_map_query_tag_tbl_tag1_idx` (`tag_id` ASC),
      CONSTRAINT `fk_tbl_map_query_tag_tbl_query`
        FOREIGN KEY (`query_id`)
        REFERENCES `mydb`.`tbl_query` (`query_id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `fk_tbl_map_query_tag_tbl_tag1`
        FOREIGN KEY (`tag_id`)
        REFERENCES `mydb`.`tbl_tag` (`tag_id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `mydb`.`tbl_query` (
  `query_id` INT NOT NULL AUTO_INCREMENT,
  `query_desc` VARCHAR(2000) NOT NULL,
   PRIMARY KEY (`query_id`))
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `mydb`.`tbl_tag` (
  `tag_id` INT NOT NULL AUTO_INCREMENT,
  `tag_name` VARCHAR(45) NOT NULL,
   PRIMARY KEY (`tag_id`))
ENGINE = InnoDB;
<小时/>

orm.xml

<?xml version="1.0" encoding="utf-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
        http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    version="2.0">
    <mapped-superclass class="com.qa.models.IdentifiableEntity">
            <attributes>
                <id name="id">
                    <column name="id" nullable="false" column-definition="INT" />
                    <generated-value strategy="AUTO" />
                </id>
            </attributes>
        </mapped-superclass>
    <entity name="Tag" class="com.qa.models.Tag" cacheable="true">
            <table name="tbl_tag" />

            <attribute-override name="id">
                <column name="tag_id" nullable="false" column-definition="INT" />
            </attribute-override>
            <attributes>
                <basic name="tagName">
                    <column name="tag_name" nullable="false" />
                </basic>
            </attributes>
    </entity>

    <entity name="Query" class="com.qa.models.Query" cacheable="true">
            <table name="tbl_query" />
            <attribute-override name="id">
                <column name="query_id" nullable="false" column-definition="INT" />
            </attribute-override>
            <attributes>
                <basic name="query">
                    <column name="query_desc" nullable="false" />
                </basic>
                <one-to-many name="tags" target-entity="com.qa.models.Tag" fetch="LAZY">
                    <join-table name="tbl_map_query_tag">
                        <join-column name="query_id" referenced-column-name="query_id" />
                        <inverse-join-column name="tag_id" referenced-column-name="tag_id" unique="true" />
                    </join-table>
                    <cascade>
                        <cascade-all />
                    </cascade>
                </one-to-many>
            </attributes>
        </entity>
</entity-mappings>    

等效的sql查询是

select q.* from tbl_query q left outer join  tbl_map_query_tag tm on q.query_id=tm.query_id left outer join tbl_tag t on t.tag_id=tm.tag_id where t.tag_id=:tagId  

我的dao方法是

public List<Query> searchQueryByTag(Tag tag) throws QADAOException {
        javax.persistence.Query query = getEntityManager().createQuery(SQL_SEL_QUERY_TAG_ID);
        query.setParameter("tag", tag);
        List<Query> queries = query.getResultList();
        return queries;

    }

当我将此查询转换为 JPQL 时,它不起作用。我的问题是如何使用 JPQL 获得与 SQL 查询结果等效的结果?

最佳答案

JPQL

select q from Query q join q.tags ts where ts in(select t from Tag t where t.id=:tagId)  

DAO方法进行少量修改

public List<Query> searchQueryByTag(Tag tag) throws QADAOException {
        javax.persistence.Query query = getEntityManager().createQuery(SQL_SEL_QUERY_TAG_ID);
        query.setParameter("tag", tag.getId());
        List<Query> queries = query.getResultList();
        return queries;

    }

关于java - JPA + 如何使用第三个表作为一对多关系中的联接来选择记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21474221/

相关文章:

java - Java中如何从数组中删除一个对象?

nhibernate - 流利的NHibernate HasManyToMany()映射

node.js - 在 sequelize.js 中获取与 belongsToMany 的关联

hibernate - JPA/Hibernate 异常处理

java - org.jboss.resteasy.spi.UnhandledException : javax. persistence.PersistenceException:无法构建实体管理器工厂

java - eclipse 链接 : No Persistence provider for EntityManager named

mysql - Sequelize.js 外键

java - 无法更改 Vaadin 中的 TreeMap 标

java - 无法使用 Android Studio 以编程方式为 View 设置 Id

java - 未找到 AdView 类