gpt4 book ai didi

hibernate - 按长度排序

转载 作者:行者123 更新时间:2023-12-02 13:55:28 24 4
gpt4 key购买 nike

有 body 可以帮助吗?我正在将休眠与Grails结合使用。

我想通过findby或createCriteria执行此sql语句

select user.username, user.email from user where user.username like something order by length(username)

按长度(用户名)的语法顺序出现问题

我已经试过了,但是得到了验证SQL语法错误:
def c = User.createCriteria();
List<User> user = c.list {
or {
ilike("username", search)
ilike("email", search)
}

order(length("username"))
//order("length(username)")
//order("username.length()")
//sqlRestriction("order by length(username)")
}

还有这个
List<User> user = User.findAllByUsernameIlikeOrEmailIlike(search, search, [sort: "length(username)"])

最佳答案

使用条件查询时,您很不走运,因为order(String propertyName)无法访问sqlProjection(java.lang.String sql, java.lang.String columnAlias, org.hibernate.type.Type type创建的别名。以下是投影usernameemailusername长度的方法:

def rows = User.withCriteria {
or {
ilike("username", search)
ilike("email", search)
}

projections {
property('username')
property('email')
sqlProjection('length(username) as usename_len', 'name_len', LONG)
}
}

上面的条件查询将返回 ListList,内部 List包含三列。但是,您不能在查询中按 name_len进行排序。您必须在Groovy中对 List进行排序:
list.sort { it[2] }
// or, and alternative for Groovy >= 2.4.4
list.toSorted { it[2] }

替代方案:HQL

可以实现您正在寻找的替代方案的是HQL:
def rows = User.executeQuery('SELECT username, email, length(username) as name_len FROM User ORDER BY name_len')

上面的HQL查询不仅返回三列,还按 length(username)排序。另外,HQL可以自己投影 User实例。相反,条件查询只能投影项目属性。这意味着您可以获得排序后的 List实例的 User
def users = User.executeQuery('SELECT u FROM User as u ORDER BY length(username)')

关于hibernate - 按长度排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33449799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com