首页 > 解决方案 > 开始的字符串的 Ebean 查询然后包含特定的字符串

问题描述

我在这里遇到了一个小问题,查询一个字符串以在数据库中搜索自动完成功能,我得到的问题是我需要首先结果是所有“开始”的语句,然后是包含该字符串的语句!

例如:如果我在数据库的一个表中得到以下记录:

  1. 提供很棒的服务
  2. 这里有别的东西
  3. 额外服务
  4. 我的服务很棒
  5. 提供的服务
  6. 动物园服务

我开始输入“服务”,我需要先显示 5,然后是其余项目(1、3、4、6)

我知道如何在 MySQL 中做到这一点,例如:

select * from `services` where `name` like '%Service%' order by `name` like 'Service%' desc;

或者可能像这里提到的方式:MySQL order by "best match"

但我需要在 Ebean 中这样做。我试过了:

return Service.find.query().where().icontains("name", search).findList()

但是这个返回 1, 3, 4, 5, 6,

现在我执行以下操作:

final List<Service> list = Service.find.query().where()
            .istartsWith("name", search)
            .orderBy("name").findList(); // First query 

            list.addAll(Service.find.query().where()
            .icontains("name", search)
            .not().istartsWith("name", search)
            .orderBy("name").findList()); // Then add the results for the second query
return list;

这将完成这项工作,5、1、3、4、6,但我不喜欢它,因为我用 2 个查询访问数据库,我也确实在第二个查询中排除了复杂数据类型查询中的第一个查询,但无论如何,这是正确的方法吗?如果没有,您有更好的方法的建议或解决方案吗?

桌子:

CREATE TABLE `services` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE services ADD UNIQUE `uq_services_name`(name);

EBean实体 Service.java:

@Entity
@Table(name = "services")
public class Service extends BaseModel<Service> {
    public static Finder<Integer, Service> find = new Finder<>(Service.class);

    @Column(nullable = false, unique = true)
    private String name;

    // ... setters and getters

}

BaseModel.java:

@MappedSuperclass
public abstract class BaseModel<T> extends Model {

    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    public final Integer getId() {
        return id;
    }

    @SuppressWarnings("unchecked")
    public final T setId(Integer id) {
        this.id = id;
        return (T) this;
    }
}

标签: javaplayframeworkebean

解决方案


我相信问题是order by name like 'Service%' desc;部分。

  • 你可以只使用 findNative(sql)

  • 最近对 Ebean 也进行了更改,以允许 order by 子句中的任意函数,因此您可以尝试更新您的 Ebean 版本并执行以下操作:

    .orderBy("name like 'Service%' desc").findList();


推荐阅读