Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 虚假的; 其他的 某人附加(连词); sb.append(tag.getTagName()); } 使某人返回字符串(); }_Java_Sql_Oracle_Hibernate_Jdbc - Fatal编程技术网

Java 虚假的; 其他的 某人附加(连词); sb.append(tag.getTagName()); } 使某人返回字符串(); }

Java 虚假的; 其他的 某人附加(连词); sb.append(tag.getTagName()); } 使某人返回字符串(); },java,sql,oracle,hibernate,jdbc,Java,Sql,Oracle,Hibernate,Jdbc,请帮助我构建相同的DetachedCreteria查询。因为我把他弄糊涂了(( 由于这三种方法必须收集一个大型sql查询,我应该用DetachedCreteria替换它,您可以通过Hibernate执行sql请求,因此不需要将其转换为Criteria API 已更新 让我们试着从方法中的查询开始 filterQueryMaker(FilterForm filter) 此方法中的条件查询不需要第一个和第二个SQL部分,只需要第三个SQL部分 "SELECT * from N

请帮助我构建相同的DetachedCreteria查询。因为我把他弄糊涂了((
由于这三种方法必须收集一个大型sql查询,我应该用DetachedCreteria替换它,您可以通过Hibernate执行sql请求,因此不需要将其转换为Criteria API

已更新

让我们试着从方法中的查询开始

filterQueryMaker(FilterForm filter)
此方法中的条件查询不需要第一个和第二个SQL部分,只需要第三个SQL部分

    "SELECT * 
      from NEWS 
        where NEWS_ID IN (
          SELECT FILTER_AUTHOR_NEWS_ID AS FILTER_AUTHOR_AND_TAG_NEWS_ID 
            FROM (
              select NEWS_ID AS FILTER_AUTHOR_NEWS_ID 
                from NEWS_AUTHOR 
                  where NEWS_AUTHOR.AUTHOR_ID IN (
                    select AUTHOR_ID 
                      from AUTHOR 
                        where AUTHOR.NAME = \'" 
+ filter.getAuthor().getName() + "\')) 
  INNER JOIN (
      SELECT NEWS_ID AS FILTER_TAG_NEWS_ID  
                    FROM ( 
                       Select NEWS_TAG.NEWS_ID, TAG.TAG_NAME 
                         from NEWS_TAG inner join TAG ON NEWS_TAG.TAG_ID = TAG.TAG_ID) 
      WHERE TAG_NAME IN (\'" + resultTags + "\')
    ) ON FILTER_AUTHOR_NEWS_ID = FILTER_TAG_NEWS_ID)" 
您将通过检查条件来添加部分条件查询。我认为您在该查询中不需要太多的子选择,请尝试使用联接简化此SQL。然后尝试使用条件API。可能是我或其他人能够帮助您使用此更简单的SQL


另外,我想知道,为什么在
filterQueryMaker(FilterPerform filter)
方法中的第一个SQL查询中需要
GROUP BY NEWS\u ID

private DetachedCriteria getCreteriaForFiltering(FilterPerform筛选器){
新闻作者的独立标准标准;
if(“.equals(filter.getAuthor().getName())&&filter.getTags().isEmpty()){
criteriaForNewsByAuthor=DetachedCriteria.forClass(News.class);
}否则{
迭代器迭代器tags=filter.getTags().Iterator();
DetachedCriteriaFortag=DetachedCriteria.forClass(NewsTag.class);
析取析取=限制。析取();
while(iteratorTags.hasNext()){
disjunction.add(Restrictions.eq(“tagId”,iteratorTags.next().getTagId());
}
标准FORTAG.add(析取);
criteriaForTag.setProjection(Property.forName(“newsId”);
DetachedCriteriaForAuthor=DetachedCriteria.forClass(NewsAuthor.class);
criteriaForAuthor.add(Property.forName(“authorId”).eq(filter.getAuthor())。
getAuthorId());
criteriaForAuthor.setProjection(Property.forName(“newsId”);
criteriaForNewsByAuthor=DetachedCriteria.forClass(News.class)
.添加(限制)或(
(criteriaForTag)中的Property.forName(“newId”),
(作者标准)中的Property.forName(“newsId”)
);
}
返回NewsByAuthor的标准;
}

我说的对吗?

对不起,但不要指望任何人都能免费阅读这些内容。@jarlh我试图做一个愚蠢的尝试…可能不成功:)不幸的是,我需要使用Criteria API:(如果你知道如何解决我的问题,请帮助我测试这个方法。使用getExecutableCriteria(会话)将这个方法的结果转换为标准我认为最好将析取创建代码(带while)移动到另一个helper方法,并在调用getCreteriaForFiltering()的方法中检查作者姓名和标记是否为空(如果条件为空)。
    "SELECT * 
      from NEWS 
        where NEWS_ID IN (
          SELECT FILTER_AUTHOR_NEWS_ID AS FILTER_AUTHOR_AND_TAG_NEWS_ID 
            FROM (
              select NEWS_ID AS FILTER_AUTHOR_NEWS_ID 
                from NEWS_AUTHOR 
                  where NEWS_AUTHOR.AUTHOR_ID IN (
                    select AUTHOR_ID 
                      from AUTHOR 
                        where AUTHOR.NAME = \'" 
+ filter.getAuthor().getName() + "\')) 
  INNER JOIN (
      SELECT NEWS_ID AS FILTER_TAG_NEWS_ID  
                    FROM ( 
                       Select NEWS_TAG.NEWS_ID, TAG.TAG_NAME 
                         from NEWS_TAG inner join TAG ON NEWS_TAG.TAG_ID = TAG.TAG_ID) 
      WHERE TAG_NAME IN (\'" + resultTags + "\')
    ) ON FILTER_AUTHOR_NEWS_ID = FILTER_TAG_NEWS_ID)" 
private DetachedCriteria getCreteriaForFiltering(FilterForm filter){        
    DetachedCriteria criteriaForNewsByAuthor;

    if ("".equals(filter.getAuthor().getName()) && filter.getTags().isEmpty()) {
        criteriaForNewsByAuthor = DetachedCriteria.forClass(News.class);
    } else {
        Iterator<Tag> iteratorTags = filter.getTags().iterator();
        DetachedCriteria criteriaForTag = DetachedCriteria.forClass(NewsTag.class);        
        Disjunction disjunction = Restrictions.disjunction();
        while(iteratorTags.hasNext()){
            disjunction.add(Restrictions.eq("tagId", iteratorTags.next().getTagId()));
        }
        criteriaForTag.add(disjunction);
        criteriaForTag.setProjection(Property.forName("newsId"));

        DetachedCriteria criteriaForAuthor = DetachedCriteria.forClass(NewsAuthor.class);
        criteriaForAuthor.add( Property.forName("authorId").eq(filter.getAuthor().
                getAuthorId()) );
        criteriaForAuthor.setProjection(Property.forName("newsId"));

        criteriaForNewsByAuthor = DetachedCriteria.forClass(News.class)
            .add(Restrictions.or(
                Property.forName("newsId").in(criteriaForTag),
                Property.forName("newsId").in(criteriaForAuthor))
            );
    }
    return criteriaForNewsByAuthor;
}