Java 将postgresql查询转换为本机查询
我想将下面的postgresql查询转换为hibernate 查询或任何支持java的查询类型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
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;
}