这怎么可能,我必须遵循标准
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奇怪的方面?
如果您正在寻找这个问题的答案,请务必阅读接受的答案及其评论.
我有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) 我正在尝试通过外键过滤结果集:
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) 我正在尝试使用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脚本: …
我需要创建一个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.它应该像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) 我是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) 我正在尝试使用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) 我知道你可以{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别名?
假设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)