我有一个包含列设置和释放的数据表,两者都有时间戳.我的目标是使用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) 假设我有一个名为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中有没有办法直接执行此操作?
无法找到这样的方式我试图做以下(降级的例子):
但是,这似乎在尝试保存新用户时会自动增加id.所有这一切都是在交易中完成的 - 这可能是原因吗?但是,我不想将它们带到事务之外,因为如果保存失败,则自动回滚将不起作用.
第二个问题(如果第一个问题的答案为否):我如何解决ID自动递增的问题.
提前致谢.
假设我有以下代码:
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)