当前位置: 首页 > 知识库问答 >
问题:

Hibernate HQL查询中的Oracle字符类型问题

邓季
2023-03-14
@Entity
@Table(name="ORG")
public class Organization  {

private String serviceName;
private String orgAcct;

     //Some other properties goes here...

@Column(name="ORG_ACCT", nullable=false, length=16)
public String getOrgAcct() {
    return this.orgAcct;
}

public void setOrgAcct(String orgAcct) {
    this.orgAcct = orgAcct;
}


@Column(name="SERVICE_NAME",nullable=true, length=16)
public String getServiceName() {
    return this.serviceName;
}

public void setServiceName(String serviceName) {
    this.serviceName = serviceName;
}

}
@Repository
@Scope("singleton") //By default scope is singleton
public class OrganizationDAOImpl implementsOrganizationDAO {

public OrganizationDAOImpl(){
}

public Organization findOrganizationByOrgAcctAndServiceName(String orgAcct,String serviceName){
    String hqlQuery = "SELECT org FROM  Organization org WHERE org.serviceName = :serName AND org.orgAcct = :orgAct";
    Query query = getCurrentSession().createQuery(hqlQuery)
        .setString("serName", serviceName)
        .setString("orgAct", orgAcct);

    Organization org =  findObject(query);
    return org;
}
 }

请帮助我解决这个问题。这里我不能将Oracle类型char更改为varchar2。我需要使用oracle char类型变量

@EngineerDollery在抛出上面的帖子之后,我用columnDefinition修改了实体类,@column注释属性。

@Column(name="SERVICE_NAME",nullable=true,length=16,columnDefinition="CHAR")
    public String getServiceName() {
        return this.serviceName;
    }

但我仍然无法检索相应列的数据。

共有1个答案

习哲彦
2023-03-14

我使用OraclePreparedStatement和Hibernate UserType接口解决了这个问题。

通过扩展org.hibernate.UserType.UserType接口创建了一个新的UserType类,并提供了nullSafeSet()、nullSafeGet()方法的实现。

nullSafeSet()方法,我们有第一个参数为PreparedStatement,在方法内部,我将PreparedStatement转换为OraclePreparedStatement对象,并使用setFixedCHAR()方法传递字符串值。

这里是UserType impl类的完整代码。

package nc3.jws.persistence.userType;

import java.io.Serializable;
import java.sql.PreparedStatement; 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import org.apache.commons.lang.StringUtils;
import org.hibernate.type.StringType;
import org.hibernate.usertype.UserType;

/**
* 
* based on www.hibernate.org/388.html
*/

 public class OracleFixedLengthCharType implements UserType {

public OracleFixedLengthCharType() {
    System.out.println("OracleFixedLengthCharType constructor");
}

public int[] sqlTypes() {
    return new int[] { Types.CHAR };
}



public Class<String> returnedClass() {
    return String.class;
}

public boolean equals(Object x, Object y) {
    return (x == y) || (x != null && y != null && (x.equals(y)));
}

@SuppressWarnings("deprecation")
public Object nullSafeGet(ResultSet inResultSet, String[] names, Object o) throws SQLException {
    //String val = (String) Hibernate.STRING.nullSafeGet(inResultSet, names[0]);
    String val = StringType.INSTANCE.nullSafeGet(inResultSet, names[0]);
    //System.out.println("From nullSafeGet method valu is "+val);
    return val == null ? null : StringUtils.trim(val);
}


public void nullSafeSet(PreparedStatement inPreparedStatement, Object o,
        int i)
                throws SQLException {

    String val = (String) o;
    //Get the delegatingStmt object from DBCP connection pool PreparedStatement object.
    org.apache.commons.dbcp.DelegatingStatement delgatingStmt = (org.apache.commons.dbcp.DelegatingStatement)inPreparedStatement;
    //Get OraclePreparedStatement object using deletatingStatement object.

    oracle.jdbc.driver.OraclePreparedStatement oraclePreparedStmpt = (oracle.jdbc.driver.OraclePreparedStatement)delgatingStmt.getInnermostDelegate();
    //Call setFixedCHAR method, by passing string type value .
    oraclePreparedStmpt.setFixedCHAR(i, val);
}


public Object deepCopy(Object o) {
    if (o == null) {
        return null;
    }
    return new String(((String) o));
}


public boolean isMutable() {
    return false;
}

public Object assemble(Serializable cached, Object owner) {
    return cached;
}


public Serializable disassemble(Object value) {
    return (Serializable) value;
}

public Object replace(Object original, Object target, Object owner) {
    return original;
}

public int hashCode(Object obj) {
    return obj.hashCode();
}

  }

在Entity类中使用@TypeDefs批注配置了此类。

@TypeDefs({
@TypeDef(name = "fixedLengthChar", typeClass = nc3.jws.persistence.userType.OracleFixedLengthCharType.class)

})

@Type(type="fixedLengthChar")
@Column(name="SERVICE_NAME",nullable=true,length=16)
public String getServiceName() {
    return this.serviceName;
}
 类似资料:
  • tickets集合中的字段称为“category”,其字段类型为。 在下面的代码中,是我要查询的类别的文档ID。 为什么返回0? 为了进行测试,我将字段类型更改为string,并将其设置为类别ID,而不是直接引用。这正确地返回了分配给类别的票证,这使我相信这是关于我如何查询字段的。

  • 问题内容: 我正在阅读oracle的基础知识,并遇到了奇怪的陈述。我不知道这是真的。 声明说 “字符串值‘2’大于字符串值‘100’。字符‘1’小于字符‘10’。” 请就上述话题发表一些看法。我了解必须使用ASCII值进行内部比较。我正在寻求一些合理的解释。 问题答案: 这意味着被视为字符串的数字不是按 数字顺序 而是按 词汇顺序排序 ,这与字典中单词的排序方式相同。即,从左侧一次比较一个字符。

  • 问题内容: 也许这听起来有点疯狂,但是我需要提出一个查询以仅从字母数字字段中检索字母。 例如: 表 1234ADD 3901AC 1812OPA 82711AUU 结果预期 ADD AC OPA AUU 谢谢! 问题答案: 看来您只想删除数字。您可以在10g或11g中使用:

  • 问题内容: 使用oracle SQL时,是否可以基于子查询中的text_string运行查询?一个例子可以阐明我要做什么 外部查询旨在计算从query_table中检索到的每个查询的结果数。 有什么方法可以执行在同一查询中从query_table中检索到的sql语句? 谢谢 编辑:我能够使用dbms_xmlgen.get_xml()函数从表中查询sql。我想任何导致sql被解析和执行的命令都可以工

  • 官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/19... 图片: number(m,n)里,m是包括整数和小数部分的总位数吧,如果总位数限制为2,那小数位数限制为7有什么意义呢? 如果红框的值是0.9999912,那stored as的值是多少?

  • 在我删除索引之后。php,我在codeigniter中启用查询字符串。但我有一些重定向链接的问题。详细信息,我有登录表单(登录/索引),登录成功时重定向到“欢迎/索引”,并在会话中保存电子邮件。 但是登录成功时只加载视图的"欢迎/索引"和错误的链接,现在链接是:"?登录/索引"并且会话不保存。请帮帮我。 这是我的密码 登录。php(控制器) Welcome.php(控制器) 欢迎留言。php(视图