Java 两个“;例如;组合和排序的查询

Java 两个“;例如;组合和排序的查询,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我有一个表“mytable”和一列“name”。我希望查询所有以某个字符串开头的行或名称中某个位置有该字符串的行,并以名称开头的行排在第一位的方式对它们进行排序。是否可能只有一个查询 我不能使用“union”,我使用的是Hibernate,它不受支持。我不希望使用视图,因为它们不是由Hibernate二级缓存缓存的。在Oracle中,您可以执行以下操作: select * from myTable mt where mt.column like '%TargetString%' orde

我有一个表“mytable”和一列“name”。我希望查询所有以某个字符串开头的行或名称中某个位置有该字符串的行,并以名称开头的行排在第一位的方式对它们进行排序。是否可能只有一个查询

我不能使用“union”,我使用的是Hibernate,它不受支持。我不希望使用视图,因为它们不是由Hibernate二级缓存缓存的。

在Oracle中,您可以执行以下操作:

select *
  from myTable mt
 where mt.column like '%TargetString%'
 order by instr(mt.column, 'TargetString')
如果您使用的是Hibernate+Oracle,它支持方言中的
instr
函数


我相信其他RDBMS也有类似的功能,这可能是由Hibernate方言支持的。

也许类似的功能可以工作

select nvl(mytable1.name, '') || nvl(mytable2.name, '') as name, 
nvl(mytable1.i, '') || nvl(mytable2.i, '') as i from 
(select 1 as i, name from mytable where name like ('string%')) mytable1
full outer join
(select 2 as i, name from mytable where name like ('%string%')) mytable2
where (mytable1.name is null or mytable2.name is null)
and mytable1.name != mytable2.name
order by i, name
但我想我会使用以下方法之一:

  • 用于此查询的带有union的简单查询
  • 改为使用Java中的排序,并将其作为两个查询来执行

编辑:由于您不喜欢使用多个条件查询-无论出于何种原因-我建议您阅读本课程。它不会提供你想要的东西。这让你几乎没有选择

一种选择是利用杠杆

另一种方法是使用Hibernate进行查询,然后使用
Collections.sort(…)
进行排序

List<MyObject> lstMyObject = ...;
Collections.sort(lstMyObject, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        // Assuming 'argument' is passed to this method and defined as 'final'
        return o1.getName().startsWith(argument) && o2.getName().startsWith(argument) ? 0 :
            o1.getName().startsWith(argument) ? -1 : 1;
    }
}
List lstMyObject=。。。;
sort(lstMyObject,新的Comparator(){
@凌驾
公共整数比较(MyObject o1,MyObject o2){
//假设“参数”被传递到此方法并定义为“final”
返回o1.getName().StartWith(参数)和&o2.getName().StartWith(参数)?0:
o1.getName().StartWith(参数)?-1:1;
}
}
这满足了以下要求:1)使用Hibernate,2)不使用多个查询,3)不使用本机SQL,4)不使用视图,5)不使用“联合”


我的建议是两个问题,类似于:

public List<MyObject> findMyObjects(...) {
    Criteria queryStartsWith = sf.getCurrentSession().createCriteria(MyObject.class)
        .add(Restrictions.like("myProperty",nameArgument,MatchMode.START))
        .addOrder(Order.desc);

    Criteria queryLike = sf.getCurrentSession().createCriteria(MyObject.class)
        .add(Restrictions.like("myProperty",nameArgument,MatchMode.ANYWHERE))
        .addOrder(Order.desc);

    List<MyObject> lstMyObject = new ArrayList<MyObject>();
    for (Object curObject : queryStartWith.list())
        if (curObject instanceOf MyObject)
            lstMyObject.add((MyObject) curObject);

    for (Object curObject : queryLike.list())
        if (curObject instanceOf MyObject)
            lstMyObject.add((MyObject) curObject);

    return lstMyObject;
}
公共列表findMyObject(…){
条件queryStartsWith=sf.getCurrentSession().createCriteria(MyObject.class)
.add(限制,如(“myProperty”、nameArgument、MatchMode.START))
.addOrder(Order.desc);
条件queryLike=sf.getCurrentSession().createCriteria(MyObject.class)
.add(限制,如(“myProperty”、nameArgument、MatchMode.ANYWHERE))
.addOrder(Order.desc);
List lstMyObject=new ArrayList();
对于(对象curObject:queryStartWith.list())
if(MyObject的curObject实例)
lstMyObject.add((MyObject)curObject);
对于(对象curObject:queryLike.list())
if(MyObject的curObject实例)
lstMyObject.add((MyObject)curObject);
返回我的对象;
}
我不确定Hibernate是否能满足您的条件排序。老实说,org.hibernate.criteria.Order类非常有限


除了使用本机SQL,这是我脑海中唯一能想到的选项。

为什么需要Hibernate?为什么JDBC和straight SQL不能管理它?仅仅因为您使用Hibernate并不意味着它必须是一个全有或全无的命题。请尝试按
indexOf(“certainString”)
dyffymo排序:我只是说明我的限制,因为我的特定环境需要。我可以在hibernate中使用两个sql查询,或者在hibernate中使用视图或本机sql,但这在我的情况下并不理想我使用的是MySQL..问题被标记了。不过谢谢你。我知道两种查询方法..要求一种..顺便说一句,所有的循环和实例检查都是完全不必要的..queryStartsWith.list().add(queryLike.list())会帮我道歉的。您没有指定不希望使用两个条件查询,只是希望使用Hibernate。被否决的人应该忙于其他的答案。至少这利用了Hibernate(这是被请求的),而不是恢复到本机SQL。