如何在字符串列上使用HIbernate条件进行比较,将其视为长列

时间:2015-07-29 10:39:01

标签: java hibernate criteria hibernate-criteria

我正在开发一个用java编写的web项目,该项目使用Hibernate从oracle数据库进行数据访问。

我的数据库中有一个列名serial,其定义为VARCHAR(12),即使它只包含可以转换为long的值。我的目的是在数字fromNotoNo之间获取所有连续出版物(将其视为数字)。我无法使用Restrictions.between,因为serial列不是数据库中的数字。它也在关联对象中定义为String。现在,我通过将数字范围转换为字符串列表并在列上执行Restricitons.in来实现(以丑陋的方式)要求。

long fromNO = 10;
long toNo = 100;
List<String> listNos = null;
for (long k = fromNo; k <=toNO; k++) {
    listNos.add(k.toString());
}

Criteria criteria = getMyHibernateSession().createCriteria(MyObject.class);
criteria.add(Restrictions.in('serialNo',listNos));
List<MyObject> results = criteria.list();

虽然我得到了预期的结果,但是当用户未定义toNo而工具需要从serial

获取所有fromNo时,就会出现问题

我的问题是如何通过指定标准将serial列视为long而不是String来编写可以克服所有这些问题的休眠标准? (某种铸造工艺可能是?)

2 个答案:

答案 0 :(得分:1)

您可以在注释为

的实体中添加新的“长”字段
-- Create dummy table
CREATE TABLE #tmpContactData (PK int NOT NULL IDENTITY(1,1))

-- Alter its schema
DECLARE @sqlCommand nvarchar(max)
SELECT @sqlCommand = '
ALTER TABLE #tmpContactData
ADD 
    EmployeeId int,
    Address varchar(100),
    Phone varchar(50)
'
EXECUTE(@sqlCommand)

-- Fill it
SELECT @sqlCommand = '
INSERT INTO #tmpContactData
SELECT t.EmployeeId, t.Address, t.Phone 
FROM (  SELECT EmployeeId=1000, Address=''Address 1000'', Phone=''Phone 1000'' 
        UNION 
        SELECT 1001, ''Address 1001'', ''Phone 1001'' 
        UNION 
        SELECT 1002, ''Address 1002'', ''Phone 1002''
) t
'
EXECUTE(@sqlCommand)

--select from it
SELECT * FROM #tmpContactData

--CleanUp
DROP TABLE #tmpContactData

然后在 @Formula("cast(serialNo as NUMBER(10,0))") private int lSerialNo;

中使用新字段lSerialNo

答案 1 :(得分:0)

请尝试使用Restrictions.between。尝试将整数解析为字符串

criteria.add(Restrictions.between('serialNo',String.valueOf(listNosFrom),String.valueOf(listNosTo)));