Java 虚假的; 其他的 某人附加(连词); sb.append(tag.getTagName()); } 使某人返回字符串(); }
请帮助我构建相同的DetachedCreteria查询。因为我把他弄糊涂了((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
由于这三种方法必须收集一个大型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;
}