小编Wis*_*ree的帖子

使用TIMESTAMPDIFF和JPA条件查询并使用hibernate作为提供程序

我有一个包含列设置和释放的数据表,两者都有时间戳.我的目标是使用CriteriaQuery在下面创建一个等价的SQL查询.

SQL查询:SELECT TIMESTAMPDIFF(SECOND, setup, released)) as sum_duration FROM calls

CriteriaBuilder#DIFF()函数显然不工作,因为它需要有数字的参数,所以我尝试使用CriteriaBuilder#功能:

EntityManager entityManager = emProvider.get();

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

CriteriaQuery<Integer> query = criteriaBuilder.createQuery();

Root<Thingy> thingyRoot = query.from(Thingy.class);

Path<DateTime> setup = root.get("setup");
Path<DateTime> release = root.get("release");

Expression secondLiteral = criteriaBuilder.literal("SECOND");

Expression func = criteriaBuilder.function("TIMESTAMPDIFF", Integer.class, secondLiteral, setup, release);

entityManager.createQuery(query).getResultList();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行此代码时,它抛出异常; 似乎文字不是作为常量呈现,而是作为参数呈现:

java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
 \-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'TIMESTAMPDIFF' {originalText=TIMESTAMPDIFF}
    \-[EXPR_LIST] SqlNode: 'exprList'
       +-[NAMED_PARAM] ParameterNode: '?' {name=param0, expectedType=null}
       +-[DOT] DotNode: 'cdr0_.setup' {propertyName=setup,dereferenceType=ALL,propertyPath=setup,path=generatedAlias0.setup,tableAlias=cdr0_,className=com.vtsl.domain.CDR,classAlias=generatedAlias0} …
Run Code Online (Sandbox Code Playgroud)

java mysql sql hibernate jpa

8
推荐指数
1
解决办法
3348
查看次数

Hibernate:将子类的实例转换为超类的实例

假设我有一个名为User的类和一个类ExtendedUser,它是User的子类.使用hibernate(JPA)注释映射这两个类:

用户:

@Entity
@Table("user-table")
@Inheritance(strategy = InheritanceType.JOINED)
public class User {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

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

}
Run Code Online (Sandbox Code Playgroud)

ExtendedUser:

@Entity
@Table(name = "extended-user-table")
@PrimaryKeyJoinColumn(name="id")
public class ExtendedUser extends User{

    @Column(name = "username")
    private String username;

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

}
Run Code Online (Sandbox Code Playgroud)

有时需要将用户提升为ExtendedUser; 类似地,有时需要将ExtendedUser降级为用户.

第一个问题:在hibernate中有没有办法直接执行此操作?

无法找到这样的方式我试图做以下(降级的例子):

  1. 将字段从ExtendedUser实例复制到User的新实例.
  2. 删除ExtendedUser实例
  3. 保存用户实例

但是,这似乎在尝试保存新用户时会自动增加id.所有这一切都是在交易中完成的 - 这可能是原因吗?但是,我不想将它们带到事务之外,因为如果保存失败,则自动回滚将不起作用.

第二个问题(如果第一个问题的答案为否):我如何解决ID自动递增的问题.

提前致谢.

java hibernate jpa

7
推荐指数
1
解决办法
890
查看次数

Scala 隐式和类型别名

假设我有以下代码:

object Potato extends App {

  type CoolString = String
  type AwesomeString = String

  def potato(string: String)(implicit coolString: CoolString, awesomeString: AwesomeString) = {
    s"$string is a string. Oh, but don't forget - $coolString and also $awesomeString"
  }

  implicit val ice : CoolString = "Really Cold Ice"
  implicit val awe : AwesomeString = "Awe inspiring object"

  potato("Stringerino")

}
Run Code Online (Sandbox Code Playgroud)

此代码失败并出现问题

[error] ... ambiguous implicit values:
[error]  both value ice in object Potato of type => Potato.CoolString
[error]  and value awe in object …
Run Code Online (Sandbox Code Playgroud)

scala

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

标签 统计

hibernate ×2

java ×2

jpa ×2

mysql ×1

scala ×1

sql ×1