Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将postgresql查询转换为本机查询_Java_Postgresql_Hibernate_Hql_Recursive Query - Fatal编程技术网

Java 将postgresql查询转换为本机查询

Java 将postgresql查询转换为本机查询,java,postgresql,hibernate,hql,recursive-query,Java,Postgresql,Hibernate,Hql,Recursive Query,我想将下面的postgresql查询转换为hibernate 查询或任何支持java的查询类型 WITH RECURSIVE tree(parent, idElement) AS ( --Anchor member definition SELECT e.fk_course_det_id, e.course_det_id,e.course_name FROM course_details AS e WHERE course

我想将下面的postgresql查询转换为hibernate 查询或任何支持java的查询类型

WITH RECURSIVE  tree(parent, idElement) AS
    (
    --Anchor member definition
        SELECT  e.fk_course_det_id, e.course_det_id,e.course_name
        FROM course_details AS e   
        WHERE course_det_id =1
        UNION ALL
    -- Recursive member definition
        SELECT d.fk_course_det_id, d.course_det_id,d.course_name
        FROM tree 
        INNER JOIN course_details AS d
            ON tree.idElement = d.fk_course_det_id
            )
            SELECT *
    FROM tree
我刚刚将上述查询转换为本机查询

    @Entity
    @Table(name = "course_details")
    @NamedNativeQuery(
        name    =   "getAllChild",
      query=" WITH RECURSIVE  tree(idElement,parent,name) AS"+
    "("+

        " SELECT  e.course_det_id,e.fk_course_det_id,e.course_name"+
        " FROM course_details AS e "+
        " WHERE e.course_det_id =?1"+
       " UNION ALL"+

         " SELECT  d.course_det_id,d.fk_course_det_id,d.course_name"+
        " FROM tree "+
         " INNER JOIN course_details AS d"+
           " ON tree.idElement = d.fk_course_det_id"+
            " )"+
            " SELECT * FROM tree",
   resultClass=CourseDetails.class
)
    @Component
    public class CourseDetails{//
    ...//}
在实现类中

@Override
    public @ResponseBody List<CourseDetails> sectionList(@ModelAttribute("course_details_create") CourseDetails cd,
            @RequestParam("cdtype") Long cdtype, Model model) {

         List<CourseDetails> allList = entityManager.createNamedQuery("getAllChild", CourseDetails.class)
                 .setParameter(1, cdtype)
                 .getResultList();
return allList;

经过一些研究,我只是将字符串sql查询传递给本机hibernate sqlquery 我得到了理想的结果

@Override
    public @ResponseBody List<CourseDetails> sectionList(@ModelAttribute("course_details_create") CourseDetails cd,
            @RequestParam("cdtype") Long cdtype, Model model) {

        Session session = getSession();
        String query = "WITH RECURSIVE  tree(parent, idElement) AS" + "(" +

                "SELECT  e.fk_course_det_id, e.course_det_id,e.course_name,e.course_desc,e.fk_book_id,e.fk_org_id"
                + " FROM course_details AS e" + " WHERE course_det_id =" + cdtype + " UNION ALL" +

                " SELECT d.fk_course_det_id, d.course_det_id,d.course_name,d.course_desc,d.fk_book_id,d.fk_org_id AS course_det_id"
                + " FROM tree" + "  INNER JOIN course_details AS d" + " ON tree.idElement = d.fk_course_det_id" + " )"
                + " SELECT *" + " FROM tree";

        SQLQuery qry = session.createSQLQuery(query);
        qry.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        List<CourseDetails> results = qry.list();

        return results;

    }
@覆盖
public@ResponseBody List sectionList(@modeldattribute(“课程详细信息”)课程详细信息cd,
@RequestParam(“cdtype”)长cdtype,模型{
Session=getSession();
String query=“递归树(父级,IDEElement)为“+”(“+
“选择e.fk\U课程详细信息id、e.course\U详细信息id、e.course\U名称、e.course\U描述、e.fk\U书籍详细信息id、e.fk\U组织详细信息id”
+“从课程详细信息为e”+,其中课程详细信息id=“+cdtype+”UNION ALL”+
“选择d.fk\U课程详细信息id、d.course\U详细信息id、d.course\U名称、d.course\U描述、d.fk\U书籍详细信息id、d.fk\U组织详细信息id作为课程详细信息id”
+“从树“+”内部连接课程\在树上的详细信息为d”+”。IDELENT=d.fk\课程\详细信息\ id”+“””
+“从树中选择*”+”;
SQLQuery qry=session.createSQLQuery(查询);
qry.setResultTransformer(标准别名到实体映射);
列表结果=qry.List();
返回结果;
}

我认为你必须编写一些JPA供应商特定的函数。但是你可以使用本机查询和映射到对象:@Rodrigo Menezes,你确定吗?在一些帖子中有关于这个问题的更多信息:HQL不支持这种类型的查询,正如前面提到的,你必须使用本机查询才能做到这一点。是的,我肯定。@RodrigoMenezes我刚刚更新了问题,请检查情况
@Override
    public @ResponseBody List<CourseDetails> sectionList(@ModelAttribute("course_details_create") CourseDetails cd,
            @RequestParam("cdtype") Long cdtype, Model model) {

        Session session = getSession();
        String query = "WITH RECURSIVE  tree(parent, idElement) AS" + "(" +

                "SELECT  e.fk_course_det_id, e.course_det_id,e.course_name,e.course_desc,e.fk_book_id,e.fk_org_id"
                + " FROM course_details AS e" + " WHERE course_det_id =" + cdtype + " UNION ALL" +

                " SELECT d.fk_course_det_id, d.course_det_id,d.course_name,d.course_desc,d.fk_book_id,d.fk_org_id AS course_det_id"
                + " FROM tree" + "  INNER JOIN course_details AS d" + " ON tree.idElement = d.fk_course_det_id" + " )"
                + " SELECT *" + " FROM tree";

        SQLQuery qry = session.createSQLQuery(query);
        qry.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        List<CourseDetails> results = qry.list();

        return results;

    }