标签: hibernate-criteria

Criteria API返回的结果集太小

这怎么可能,我必须遵循标准

Criteria criteria = getSession().createCriteria(c);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.add(Restrictions.eq("active",true));
List list = criteria.list();

列表的大小现在是20.如果我在条件中添加最大结果,

Criteria criteria = getSession().createCriteria(c);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setMaxResults(90);
criteria.add(Restrictions.eq("active",true));
List list = criteria.list();
Run Code Online (Sandbox Code Playgroud)

..现在列表的大小是18!

在定义最大结果后,我不明白结果集大小如何更小,因为行数小于定义的最大值.这肯定看起来像一个bug,或者还有一些我不知道的hibernate奇怪的方面?


如果您正在寻找这个问题的答案,请务必阅读接受的答案及其评论.

java hibernate criteria hibernate-criteria

14
推荐指数
1
解决办法
5432
查看次数

Hibernate使用标准和限制加入

我有2个实体

PayoutHeader.java

@Entity
public class PayoutHeader extends GenericDomain implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;        
    @Column
    private Integer month;
    @Column
    private Integer year;
    @OneToOne
    private Bank bank;
    @Column
    private Double tdsPercentage;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date **chequeIssuedDate**;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date entryDate;

}
Run Code Online (Sandbox Code Playgroud)

PayoutDetails .java

@Entity
public class PayoutDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;        

    @ManyToOne
    private PayoutHeader payoutHeader;

    @Column
    private Double amount;
    @Column
    private String bankName;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date clearingDate;
    @OneToOne    
    private Advisor advisor;

    @Column
    private Long …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-criteria

14
推荐指数
1
解决办法
5万
查看次数

无法通过反射getter获取字段值

我正在尝试通过外键过滤结果集:

createCriteria(Person.class).add(Restrictions.ne("position", 1L)).list()
Run Code Online (Sandbox Code Playgroud)

但得到这个例外: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.example.model.Position.id

以下是必要的JPA实体(修剪到必要的字段):

@Entity
@Table
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(nullable = false)
    @ForeignKey(name = "person_position_fkey")
    private Position position;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Position getPosition() {
        return position;
    }

    public void setPosition(Position position) {
        this.position = position;
    }
}

@Entity
@Table
public class Position {
    @Id
    @GeneratedValue
    private …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-criteria

14
推荐指数
1
解决办法
1万
查看次数

Hibernate CriteriaBuilder加入多个表

我正在尝试使用hibernate criteriabuilder加入4个表.
下面分别是表..`

@Entity
public class BuildDetails {
    @Id
    private long id;
    @Column
    private String buildNumber; 
    @Column
    private String buildDuration;
    @Column
    private String projectName;

}   

@Entity
public class CodeQualityDetails{
    @Id
    private long id;
    @Column
    private String codeHealth;
    @ManyToOne
    private BuildDetails build; //columnName=buildNum
}

@Entity
public class DeploymentDetails{
    @Id
    private Long id;
    @Column
    private String deployedEnv;
    @ManyToOne
    private BuildDetails build; //columnName=buildNum
}

@Entity
public class TestDetails{
    @Id
    private Long id;
    @Column
    private String testStatus;
    @ManyToOne
    private BuildDetails build; //columnName=buildNum
}
Run Code Online (Sandbox Code Playgroud)


在这4个表中,我想为MySQL执行以下sql脚本: …

java mysql hibernate hibernate-mapping hibernate-criteria

14
推荐指数
1
解决办法
2万
查看次数

如何将Hibernate Criteria对象用于多个和/或条件

我需要创建一个Hibernate标准限制,或3条件.问题是最后一个条件是使用AND运算符的条件.

我的第一个条件:

Criterion startInRange = Restrictions.between("expectedStartCanonicDate", 
                                               rangeStart, rangeEnd);
Run Code Online (Sandbox Code Playgroud)

我的第二个条件:

Criterion endInRange = Restrictions.between("expectedCompletionCanonicDate", 
                                             rangeStart, rangeEnd);
Run Code Online (Sandbox Code Playgroud)

我的第三个条件需要和以下两个条件一起:

criteria.add(Restrictions.le("expectedStartCanonicDate", rangeStart));
criteria.add(Restrictions.ge("expectedCompletionCanonicDate", rangeEnd));
Run Code Online (Sandbox Code Playgroud)

我想要做的限制是condition1或condition2或condition3.我找到了让我接近的例子.我可以一起使用LogicalExpression或者前两个条件,但是,我不确定如何处理or3个条件,特别是当最后一个条件实际上是两个独立的条件anded时.

有什么想法吗?弗雷德

hibernate-criteria

13
推荐指数
1
解决办法
4万
查看次数

Hibernate Criteria API中的SQL'LIKE'运算符

我想用Hibernate实现一些通用过滤器Criteria.它应该像LIKESQL中的运算符一样工作:

SELECT * FROM table WHERE table.ANYCOLOUMNHERE LIKE '%'||anyvaluehere||'%'
Run Code Online (Sandbox Code Playgroud)

Map<String, String>这里的关键是列名,价值是它的价值.

我试过这样的事情:

for (Entry<String, String> filter : filters.entrySet()) {
    crit.add(Restrictions.ilike(filter.getKey(), filter.getValue(), MatchMode.ANYWHERE));
}
Run Code Online (Sandbox Code Playgroud)

但是当字段类型不是String时,它会导致 java.lang.ClassCastException:

[com.nsn.util.LoggerUtilerror] (http-localhost-127.0.0.1-8080-1) Error while getting alarms: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
    at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:36) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:57) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1891) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1862) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1737) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:828) [hibernate-core-4.1.1.Final.jar:4.1.1.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) …
Run Code Online (Sandbox Code Playgroud)

java hibernate criteria hibernate-criteria sql-like

13
推荐指数
3
解决办法
3万
查看次数

Java - Hibernate criteria.setResultTransformer()使用默认值初始化模型字段

我是Hibernate的新手,我正试图从数据库中获取一些数据.我不想获得完整的数据,而是实体的投影.

问题是在for循环中,当我得到我的投影的id和名称时,它得到默认值id = 0和name = null而不是id = 7和name ="Name 8"这是记录的数据库中的原始实体.你知道导致这个问题的原因吗?for循环在最后一个代码中.

这是学生实体

@Entity(name = "Students")
public class Student {
    @Id
    @GeneratedValue
    @Column(name = "StudentId")
    private int id;

    @Column(name = "Name", nullable = false, length = 50)
    private String name;

    @Column(name = "Grade")
    private Double grade = null;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FacultyId", nullable = false)
    private Faculty faculty;

    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
        joinColumns = @JoinColumn(name = "StudentId"),
        inverseJoinColumns = @JoinColumn(name = "CourseId"))
    private Collection<Course> courses;

    public Student() {
        this.courses = …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-criteria map-projections

13
推荐指数
1
解决办法
3万
查看次数

关于集合值的Hibernate标准

我正在尝试使用Hibernate组合一个复杂的查询.我一直倾向于Criteria,但我开始怀疑它不可能,所以任何建议都会有所帮助.

我有一个如下的实体结构:

public class Attribute {
    private Integer id;
    private String name;
    private Set<Value> values;
}

public class Instance {
    private Integer id;
    private int instanceRef;
    private Set<Value> values;
}

public class Value {
    private Integer id;
    private Attribute attribute;
    private String localAttributeName;
    private Instance instance;
    private String value;
}
Run Code Online (Sandbox Code Playgroud)

这些实体与您期望的相关:

value.attribute_id --> attribute.id
value.instance_id --> instance.id
Run Code Online (Sandbox Code Playgroud)

现在,我希望能够获取一组属性/值对(字符串)并查找包含所有这些属性/值对的所有实例.在Value中,attribute和localAttributeName中只有一个是非null,因此属性名称可以匹配localAttributeName或attribute.name.最后一次使事情复杂化,Value上的唯一索引是(实例,属性,值)或(实例,localAttributeName,value) - 也就是说,在实例中,任何给定的Attribute都可能有多个值.

这是我到目前为止:

public List<Instance> getMatchingInstances(Map<String, String> attrValues) {
    Criteria crit = session.createCriteria(Instance.class, "i");
    for(Map.Entry<String, String> entry : attrValues) { …
Run Code Online (Sandbox Code Playgroud)

java orm hibernate hibernate-criteria

12
推荐指数
1
解决办法
3万
查看次数

引用外部条件查询SQLProjection中的别名

我知道你可以{alias}用来引用SQLProjection中的根实体:

Projections.sqlProjection("MIN({alias}.field) as value", new String[]{"value"}, new Type[]{new LongType()}))
Run Code Online (Sandbox Code Playgroud)

我想要做的是引用非root实体的别名:

Projections.sqlProjection("MIN(i.powerRestarts) as value", new String[]{"value"}, new Type[]{new LongType()}))
Run Code Online (Sandbox Code Playgroud)

where i外部条件查询中的别名.上面的代码抛出一个SQL异常,说i.powerRestarts无法找到.

是否可以从SQLProjection引用非root别名?

java hibernate hibernate-criteria

12
推荐指数
1
解决办法
1万
查看次数

标准渴望fetch-joined集合以避免n + 1选择

假设Item和Bid是实体:Item有很多Bids.它们以典型的父/子关系映射到Hibernate中:

<class name="Item" table="ITEM">
  ...
  <set name="bids" inverse="true">
    <key column="ITEM_ID"/>
    <one-to-many class="Bid"/>
  </set>
</class>
Run Code Online (Sandbox Code Playgroud)

在执行此查询后尝试访问每个项目的出价时,如何避免n + 1选择?

List<Item> items = session.createCriteria(Item.class)
                        .createAlias("bids", "b").
                        .add(Restrictions.gt("b.amount", 100)).
                        .list();
Run Code Online (Sandbox Code Playgroud)

注意我需要一个热切的提取出价,但对集合有进一步的限制(b.amount> 100)

我尝试了下面的失败:

List<Item> items = session.createCriteria(Item.class)
                        .setFetchMode("bids", FetchMode.JOIN).
                        .createAlias("bids", "b").
                        .add(Restrictions.gt("b.amount", 100)).
                        .list();                        

List<Item> items = session.createCriteria(Item.class)
                        .createCriteria("bids")
                        .add(Restrictions.gt("amount", 100)).
                        .list();                        
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-criteria

12
推荐指数
2
解决办法
3万
查看次数