【问题标题】:Grails: How to search a key word in encrypted column and get rowsGrails:如何在加密列中搜索关键字并获取行
【发布时间】:2017-02-07 08:34:23
【问题描述】:

我正在开发一个 grails 应用程序,它可以在数据库中保存 SMS 或电子邮件。这些消息以加密格式保存。

我正在尝试使用关键字搜索条件从表中获取行。由于这是加密的,我无法找到可以使用关键字搜索的查询。

我尝试将transients 添加到域类并对其进行解密。代码如下:

在域类中:

 static transients = ['decrypted']

 String getDecrypted() {
     return DESCodec.decryptText(message)
 }

 def m2 = Messages.findAll {-1 == it.getDecrypted().indexOf("xyz")};

这不起作用。

谁能告诉我是否有办法通过在加密列中使用关键字进行搜索来获取行?

非常感谢任何帮助。

【问题讨论】:

    标签: mysql grails grails-domain-class grails-2.1


    【解决方案1】:

    我建议您阅读此Using transient property in findBy or listOrderBy methods

    基本上,当您手头有一个对象时,一个瞬态对象就会变得可用。所以编写 hql/hibernate 查询并不会真正起作用。执行以下操作可能会更好:

    def m2 = Messages.findAll {-1 == DESCodec.decryptText(it.message).contains("xyz")}; 
    

    上面的不确定,你需要玩的东西

    这就是你想要做的事情

    def listing = Messages.executeQuery("from Messages" ,[:],[max:-1])
    def found = listing.findAll {-1 == it.decrypted.contains("xyz")};
    

    或手动:

      def listing = Messages.executeQuery("select new map(id as id, message as message) from Messages" ,[:],[max:-1])
        def found = listing.findAll {-1 == DESCodec.decryptText(it.message).contains("xyz")};
    

    【讨论】:

    • 感谢您的建议。当我厌倦了代码时,我收到了一条错误消息No signature of method: static security.DESCodec.decryptText() is applicable for argument types: (grails.gorm.DetachedCriteria) values: [grails.gorm.DetachedCriteria@98e98f]
    • 您需要进行实验。当您拥有对象时,它具有解密的值,所以可能Messages.findAll().findAll {-1 == it.decrypted.indexOf("xyz")}; 双重 findAll 不确定这是否适用于以后的 grails。但是获取所有对象然后通过集合检查的查询是关键。缺点显然是必须收集所有数据
    • 是的,就是这个原因。收集所有数据会减慢这个过程。
    猜你喜欢
    • 2016-03-25
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多