java - Criteria 当只需要实体类的一部分时,添加实体类中的所有表

标签 java hibernate postgresql criteria hibernate-criteria

当我使用 hibernate - Criteria 创建计数查询时 - 从实体类添加所有可能的表作为左连接,这是糟糕的性能。

实体:

@Entity
@Table(name = "employees")
Public Class Employees {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "lz_job_stat_id")
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "departments_id")
    private Departments  departments;


    @ManyToOne
    @JoinColumn(name = "managers_id")
    private Managers  managers;

}

标准:

public class EmployeeDao {

    public List<EmpDao> findIt(){
        .....
        Criteria crit = createEntityCriteria().setFetchMode("departments", FetchMode.SELECT);
        crit.add(Restrictions.eq("managers.deleted", false));

        crit.setProjection(Projections.count("id"));
        return crit.list();
    }
}

以及生成的 SQL:

select count() as y0_ 
from employees this_ 
left outer join departments department3_ 
    on this_.department_id=department3_.department_id
left outer join managers manager2_ 
    on this_.manager_id=manager2_.manager_id

现在当我尝试 crit.list - 它为所有可能的表创建一个左连接。

当它不应该为所有这些创建连接时。 难道 Criteria 不够聪明,知道我不需要这张表吗?只有一个我使用了 "WHERE CLAUSE" 有没有办法明确告诉 Criteria “不要加入这个表格!!!” 没有 SQL

最佳答案

ManyToOne 注释上指定获取类型:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "departments_id")
private Departments  departments;

或恕我直言,在标准中更可取:

criteria.setFetchMode("departments", FetchMode.SELECT)

关于java - Criteria 当只需要实体类的一部分时,添加实体类中的所有表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37784420/

相关文章:

java - 将 JSON 嵌套数组插入 MySQL

java - Hibernate 标准在 Web 应用程序中花费的时间太长,但在 SQLPlus 中却很快?

java - 表未映射 Hibernate

postgresql - Sequelize 检查表是否已创建

postgresql - hibernate 动态查询

java - 使用 Php-Java 桥

java - 如何检测WinPcap库是否安装?

java - Avro ReflectDatumWriter 中的 NullPointerException

mysql - 如果另一个数据库2中存在同名的另一个表,Hibernate无法在数据库1中自动创建表

sql - width_bucket 不返回等宽的桶