【问题标题】:How to get data from DB by trim spaces using Hibernate?如何使用 Hibernate 通过修剪空格从数据库中获取数据?
【发布时间】:2014-08-01 07:42:20
【问题描述】:

我写了一个控制器,如下所示

  @RequestMapping(value="find/{roleName}", method=GET)
    public UserRole getByRoleName(@PathVariable("roleName") String roleName){ 
     UserRole userRole = userRoleService.findByRoleName(roleName);
        return userRole;   
    }
UserRole is nothing but that is given below as shown that

 @Entity

@Table(name = "uro_user_roles") 公共类用户角色 {

/* Properties */
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "uro_role_id")
private Integer roleId;

@Column(name = "uro_role_name")
private String roleName;

@Column(name = "uro_create_user")
private String createUser;

@Column(name = "uro_active")
private String createActive;

/* Getter / Setters */ 

现在,当我使用以下 Hibernate 函数给出 roleName 时,我得到了数据库数据,这就是

     public UserRole findByRoleName(String roleName) {
     UserRole userPermission = (UserRole)  
      criteria().setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                .add(eq("roleName", roleName)).uniqueResult();
        return userPermission;
    }

我的问题是,当我给出确切的名称时,它只返回对象,因为它区分大小写。我的意思是,如果表数据在其值之前有一些空间,那么它不会返回。那么如何通过给定一个没有空格和区分大小写的名称来获取数据。hibernate 中是否有任何选项可以从数据库中获取数据并消除空格?如果有一个选项,则无需编写您要求的 Trim() 方法。请大家帮忙

【问题讨论】:

  • 可能你可以使用正则表达式。然后,您将获得与该模式匹配的所有结果。我猜这会是更好的方法
  • 我已经更新了我的答案。立即尝试。
  • 我的回答对你有帮助吗?
  • 没有。我想要 .add(eq("rolename", roleName.trim().toLowerCase())).uniqueResult();。但我不知道这是对还是错,我也试过这个但没有改变

标签: java mysql spring hibernate jpa


【解决方案1】:

您可以使用 SQL 限制:

public UserRole findByRoleName(String roleName) {
    UserRole userPermission = (UserRole) criteria()
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            .add(Restrictions.sqlRestriction("TRIM(LOWER({alias}.roleName)) = ?", roleName.trim().toLowerCase()), StringType.INSTANCE))
            .uniqueResult();
    return userPermission;
}

这适用于 MySQL,但并非所有数据库都有 TRIM() 函数。其他数据库有LTRIM()RTRIM(),所以你必须像LTRIM(RTRIM(...)) 这样称呼它。

【讨论】:

    【解决方案2】:

    在比较之前在字段上做一个小写。我假设该字段永远不会为空。

     public UserRole findByRoleName(String roleName) {
     UserRole userPermission = (UserRole)  
      criteria().setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                .add(eq("rolename", roleName.trim().toLowerCase())).uniqueResult();
        return userPermission;
    }
    

    【讨论】:

    • 对不起,这里不是区分大小写的问题,这里是空格问题。如果 DB 表中的名称之前存在空格,那么它确实返回 null。所以有没有像你给 toLowerCase() 方法这样的 Trim() 函数.
    • 没有变化。同样的问题。它什么也不返回。任何其他选项请帮助
    • 表数据中存在的空间。那么如何获取呢?
    • 更新了答案。立即尝试。
    猜你喜欢
    • 2020-07-19
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多