首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用hibernate (或SQL查询)在键值表中搜索

使用hibernate (或SQL查询)在键值表中搜索
EN

Stack Overflow用户
提问于 2013-06-18 14:59:14
回答 1查看 468关注 0票数 1

我有两张桌子:

  • 内容(id、数据、标题、大小)
  • ContentProperties(id,key,value,fk_content_id)

每个内容记录可以有许多属性(一对多)。我想使用hibernate检索具有以下条件的内容记录(它是伪代码):

代码语言:javascript
复制
(content.title == "article") 
AND
if(content.contentProperties.key == "author")
{
    content.contentProperties.value = "david"
} 
AND
if(content.contentProperties.key == "pages")
{
    content.content.contentProperties.value <= "150"
    content.content.contentProperties.value >= "050"
}

它的SQL查询是什么?我如何使用hibernate api来做到这一点?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 17:56:15

我用Restrictions.sqlRestriction创建了键值条件:

代码语言:javascript
复制
private Criterion createKeyValueSqlCriteria(String key, String operator, Object value)
{
    if(operator.equals("like"))
    {
        value = "%" + ((String)value) + "%";
    }
    Object[] valueArray = {key, value};
    Type[] typeArray = {StringType.INSTANCE, getValueType(value)};

    String query = "exists ( select 1 from CONTENT_PROPERTY cp " + 
                   "where cp.FK_CONTENT_ID = {alias}.CONTENT_ID " +
                   "and cp.KEY= ? and cp.VALUE " + operator + " ? )";

    Criterion criterion = Restrictions.sqlRestriction(query,valueArray,typeArray);
    return criterion;
}

private Type getValueType(Object value)
{
    if(value instanceof String)
    {
         return StringType.INSTANCE;
    }
    else if (value instanceof Long)
    {
         return LongType.INSTANCE;
    }
    else if (value instanceof Double)
    {
         return DoubleType.INSTANCE;
    }
    else if (value instanceof Boolean)
    {
         return BooleanType.INSTANCE;
    }
    else if (value instanceof Date)
    {
         return DateType.INSTANCE;
    }
    else
    {
        return null;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17172245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档