【问题标题】:Hibernate 5 Query By Example adds criteriaHibernate 5 Query By Example 添加条件
【发布时间】:2017-01-21 11:53:22
【问题描述】:

所以,我使用的是最新的 Hibernate 5.x 版本。我正在尝试做一个简单的示例查询。

这里是hibernate实体类:

@SuppressWarnings("serial")
@Entity
@Table(name = "company")
public class CompanyEntity implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "company_id")
private long companyId;

// `account_enabled` varchar(15) NOT NULL,
@Column(name = "company_enabled", columnDefinition = "BIT")
private boolean companyEnabled;

@Column(name = "company_name")
private String companyName;

@Column(name = "company_address1")
private String address1;

@Column(name = "company_address2")
private String address2;

@Column(name = "company_city")
private String addressCity;

@Column(name = "company_state")
private String addressState;

@Column(name = "company_postal_code")
private String addressPostalCode;

@Column(name = "company_country")
private String addressCountry;

@Column(name = "company_phone")
private String phone;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "company_parent")
private CompanyEntity parent;

@Column(name = "entered_by")
private long enteredBy;

@Column(name = "entered_date")
@Temporal(TemporalType.TIMESTAMP)
private Date enteredDate;

@Column(name = "edited_by")
private long editedBy;

@Column(name = "edited_date")
@Temporal(TemporalType.TIMESTAMP)
private Date editedDate;

... getters, setters, hashCode, equals, toString 
    as auto-generated by Eclipse
 ...'
}

这是道中的示例查询:

@Override
public List<CompanyEntity> getCompanyEntityByExample(CompanyEntity exampleEntity)
{
    Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(CompanyEntity.class).add(Example.create(exampleEntity));

    List<CompanyEntity> companyEntityList = criteria.list();

    System.out.println("getCompanyEntityByExample: companyEntityList: size=" + companyEntityList.size());
    System.out.println("getCompanyEntityByExample: companyEntityList=" + companyEntityList);

    return companyEntityList;
}

这里是测试这个的测试:

 @Test
public void testGetCompanyByExample()
{
    String addressCity = "Boston";
    CompanyEntity exampleEntity = new CompanyEntity();
    exampleEntity.setAddressCity(addressCity);
    List<CompanyEntity> companyList = companyDao.getCompanyEntityByExample(exampleEntity);
    assertNotNull(companyList);
    assertEquals(true, companyList.size() == 1);
}

我知道数据库记录应该至少返回一条记录,但在这种情况下,我没有得到任何数据。

这是实际执行的查询:

select this_.company_id as company_1_1_1_, this_.company_address1 as company_2_1_1_, this_.company_address2 as company_3_1_1_, this_.company_city as company_4_1_1_, this_.company_country as company_5_1_1_, this_.company_postal_code as company_6_1_1_, this_.company_state as company_7_1_1_, this_.company_enabled as company_8_1_1_, this_.company_name as company_9_1_1_, this_.edited_by as edited_10_1_1_, this_.edited_date as edited_11_1_1_, this_.entered_by as entered12_1_1_, this_.entered_date as entered13_1_1_, this_.company_parent as company15_1_1_, this_.company_phone as company14_1_1_, companyent2_.company_id as company_1_1_0_, companyent2_.company_address1 as company_2_1_0_, companyent2_.company_address2 as company_3_1_0_, companyent2_.company_city as company_4_1_0_, companyent2_.company_country as company_5_1_0_, companyent2_.company_postal_code as company_6_1_0_, companyent2_.company_state as company_7_1_0_, companyent2_.company_enabled as company_8_1_0_, companyent2_.company_name as company_9_1_0_, companyent2_.edited_by as edited_10_1_0_, companyent2_.edited_date as edited_11_1_0_, companyent2_.entered_by as entered12_1_0_, companyent2_.entered_date as entered13_1_0_, companyent2_.company_parent as company15_1_0_, companyent2_.company_phone as company14_1_0_ from company this_ left outer join company companyent2_ on this_.company_parent=companyent2_.company_id where (this_.company_city=? and this_.company_enabled=? and this_.edited_by=? and this_.entered_by=?)

如果你注意到 where 子句,它会说:

where (this_.company_city=? and this_.company_enabled=? and this_.edited_by=? and this_.entered_by=?)

它应该只是:

where (this_.company_city=?)

所以,额外的标准会影响我的查询,我无法获得正确的结果。

我想知道如何纠正和解决这个问题?我用谷歌搜索了几次,在我来这里之前先检查了hibernate论坛。 非常感谢任何帮助。

谢谢!

【问题讨论】:

    标签: java mysql hibernate hibernate-criteria


    【解决方案1】:

    company_enablededited_byentered_by 字段是原语,因此它们在创建时具有值,对于布尔值,它是 false,并且长期为 0。所以当对象被创建时,值就在那里,当您调用过滤器时,休眠会看到字段值并将它们放在查询中。

    【讨论】:

    • 这意味着我永远无法通过示例使用 Hibernate ...我永远不知道用户将成为 enter_by 或 edit_by 的用户。我可以将它们更改为 UserEntity 并摆脱原语....并且我可以将布尔值设为布尔值。必须有更好的方法来解决这个问题,或者我想我只是不使用 Hibernate By Example。
    • 也许您可以将其更改为他们的对象框:Boolean 和 Long 并添加到字段 @Column(nullable=false)。因此,当您创建示例对象时,它们将保持为空,如果字段为空,Hibernate 将不会持久保存该对象。
    • 是的。这并不理想,但我认为这是最好的解决方案!谢谢!
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多