Java Tomcat 8、Hibernate 5.2、MSSQL、HikariCP标准搜索返回空值

Java Tomcat 8、Hibernate 5.2、MSSQL、HikariCP标准搜索返回空值,java,sql-server,hibernate,hikaricp,Java,Sql Server,Hibernate,Hikaricp,目前,我们正在对应用程序的DB CRUD功能进行性能评估和改进,其中一项评估是使用Hikari连接池以及Hibernate和Hibernate HikariCP的更高版本进行测试 我们将Hibernate版本从5.2.10升级到5.2.16,Hikari版本为3.1.0。使用Tomcat 8和MSSQL 2016对整个练习进行了测试 为了简单起见,我们使用实体用户对一个简单搜索和一个搜索条件进行了测试 休眠XML配置: <hibernate-configuration> <

目前,我们正在对应用程序的DB CRUD功能进行性能评估和改进,其中一项评估是使用Hikari连接池以及Hibernate和Hibernate HikariCP的更高版本进行测试

我们将Hibernate版本从5.2.10升级到5.2.16,Hikari版本为3.1.0。使用Tomcat 8和MSSQL 2016对整个练习进行了测试

为了简单起见,我们使用实体用户对一个简单搜索和一个搜索条件进行了测试

休眠XML配置:

<hibernate-configuration>
  <session-factory>
    <property name = "hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="show_sql">true</property>  

    <!-- Hikari specific properties -->
    <property name="hibernate.connection.provider_class">com.zaxxer.hikari.hibernate.HikariConnectionProvider</property>
    <property name="hikari.maximumPoolSize">30</property>
    <property name="hikari.idleTimeout">300000</property>
    <property name="hikari.maxLifetime">1800000</property>

    <!-- Database connection properties -->
    <property name="hibernate.hikari.dataSourceClassName">com.microsoft.sqlserver.jdbc.SQLServerDataSource</property>

<property name="hibernate.connection.url">jdbc:sqlserver://192.168.0.102:1433;databaseName=migration1;user=sun;password=p@ssw0rd;</property>
        <property name = "hibernate.connection.username">sun</property>
        <property name = "hibernate.connection.password">p@ssw0rd</property>

    <mapping class="com.hib.model.Outlet"/>
    <mapping class="com.hib.model.Receipt"/>
    <mapping class="com.hib.model.Cashier"/>
    <mapping class="com.hib.model.Category"/>
    <mapping class="com.hib.model.Item"/>
    <mapping class="com.hib.model.PayMethodName"/>
    <mapping class="com.hib.model.Pos"/>
    <mapping class="com.hib.model.Purchase"/>
    <mapping class="com.hib.model.User"/>
  </session-factory>
</hibernate-configuration>
String sql = "SELECT * FROM USER_LOG WHERE id = :number_id";
            SQLQuery query = session.createSQLQuery(sql);
            query.addEntity(User.class);
            query.setParameter("number_id", id);
            result = query.list(); 
带注释的用户实体,不包括getter/setter:

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlRootElement;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.UpdateTimestamp;
@Entity
@Table(name = "User")
@XmlRootElement
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Basic(optional = false)
    @Column(name = "id")
    @NotNull
    @GeneratedValue(generator="`id`")
    @GenericGenerator(name="`id`", strategy = "increment")
    private Integer id;

    @NotNull
    @Column(name = "FullName")
    private String fullName;

    @Column(name = "NickName")
    private String nickName;

    @Column(name = "Tel")
    private String tel;

    @Column(name = "Rank")
    private String rank;

    @NotNull
    @Column(name = "Email")
    private String email;

    @NotNull
    @Column(name = "Password")
    private String password;

    @Lob
    @Column(name = "PhotoUpload")
    private String photoUpload;

    @Version
    @Column(name = "CreateDate")
    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    private Date createDate;

    @Version
    @Column(name = "EditDate")
    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    private Date editDate;

    @Column(name = "CreateBy")
    private String createBy;

    @Column(name = "ActiveInd")
    private String activeInd;

    @Column(name = "LastLogin")
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastLogin;

    @Column(name = "tenant_id")
    private String tenantId;

    @NotNull
    @Column(name = "group_id")
    private String groupId;

    public User() {
    }

    public User(Integer id, String fullName,String nickName,String tel,String rank,String email,String password,String photoUpload,Date createDate,Date editDate,String createBy,String activeInd,Date lastLogin, String tenantId, String groupId) {
        this.id = id;
        this.fullName = fullName;
        this.nickName = nickName;
        this.tel =tel;
        this.rank=rank;
        this.email =email;
        this.password = password;
        this.photoUpload = photoUpload;
        this.createDate =createDate;
        this.editDate =editDate;
        this.createBy =createBy;
        this.activeInd = activeInd;
        this.lastLogin=lastLogin;
        this.tenantId= tenantId;
        this.groupId =groupId;
    }

@Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof User)) {
            return false;
        }
        User other = (User) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }

        return true;
    }

    @Override
    public String toString() {
        return "com.example.dao.User[ id=" + id + " ]";
    }
搜索特定用户的功能在用户服务类的此方法中:

@Override
    public List<User> getUserById(Integer id) {
        List<User> result = null;
        Session session = getSession();

        try {

        Criteria criteria = getSession().createCriteria(User.class);
        Criteria criteria = getSession().(User.class);
        criteria.add(Restrictions.eq("id", id));
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        result = query.getResultList();

        }catch (HibernateException e){
            userLogger.error("Error found: " + e);
        }finally {
            if (session != null)
                session.close(); 
        }
        return result;
    }
由于HikariCP对其他本机查询做了很多改进,我们认为如果我们仍然能够继续使用该CP来支持C3P0池,那就更好了。然而,我们仍然无法确定服务类方法中的哪种方法是最好的


我们感谢您在这方面提供的任何帮助。谢谢。

您是否将
User
添加到
persistence.xml
文件中?@RodrigoMartinTatoRothamel是的。
TypedQuery<User> query = session.createQuery("select u from "+User.class.getSimpleName()+" u",User.class) ;
result = query.getResultList();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
cq.select(root);
Query<User> q = session.createQuery(cq);
result = q.getResultList();
String sql = "SELECT * FROM USER_LOG WHERE id = :number_id";
            SQLQuery query = session.createSQLQuery(sql);
            query.addEntity(User.class);
            query.setParameter("number_id", id);
            result = query.list();