我正在开发一个用java编写的web项目,该项目使用Hibernate从oracle数据库进行数据访问。
我的数据库中有一个列名serial
,其定义为VARCHAR(12)
,即使它只包含可以转换为long
的值。我的目的是在数字fromNo
和toNo
之间获取所有连续出版物(将其视为数字)。我无法使用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
来编写可以克服所有这些问题的休眠标准? (某种铸造工艺可能是?)
答案 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)));